usando tutorial nodejs node español cómo crear node.js mongodb mongoose schema-design nosql

node.js - tutorial - node js express mongodb rest api



Utilice más de un esquema por colección en mongodb (2)

Quería usar más de un esquema por colección en mongodb, ¿cómo usarlo ...?
Me da este error cuando intento ejecutarlo:

Error:

OverwriteModelError: no se puede sobrescribir el modelo de todos los allUsers una vez compilado.
OverwriteModelError: no se puede sobrescribir el modelo checkInOut una vez compilado.


Heres my schema.js

var mongoose = require(''mongoose''); var Schema = mongoose.Schema , ObjectId = Schema.ObjectId; var checkInInfoSchema= new Schema({ name:String, loginSerialId:Number }); var loginUserSchema = new Schema({ sn : { type: Number, unique:true } ,uname: {type:String, unique:true} ,pass:String }); var registerUserSchema = new Schema({ sn : { type: Number, unique:true } , name: String //his/her name ,pass:String, companyKey:{type:String}, uname:{type:String,unique:true} }); var checkInOutSchema = new Schema({ uname: String ,companyKey:String ,task:String ,inTime:String ,outTime:String ,date:{type:String} ,serialId:{type:Number,unique:true} ,online:Boolean }); //Different schema for same collection "allUsers" var allUser=mongoose.model(''allUsers'',loginUserSchema); var registerUser=mongoose.model(''allUsers'',registerUserSchema); //Different schema for same collection "checkInOut" var checkInOut=mongoose.model(''checkInOut'',checkInOutSchema); var checkInInfo=mongoose.model(''checkInOut'',checkInInfoSchema); module.exports={ allUser:allUser, registerUser:registerUser, checkInOut:checkInOut, checkInInfo:checkInInfo };


En mangosta puedes hacer algo como esto:

var users = mongoose.model(''User'', loginUserSchema, ''users''); var registerUser = mongoose.model(''Registered'', registerUserSchema, ''users'');

Estos dos esquemas se guardarán en la colección de ''usuarios''.

Para obtener más información, puede consultar la documentación: http://mongoosejs.com/docs/api.html#index_Mongoose-model o puede ver la siguiente información que podría ayudar.


Intenté la respuesta seleccionada, pero al consultar un objeto de modelo específico, recupera los datos de ambos esquemas. Así que creo que usar discriminador produce una mejor solución:

const coordinateSchema = new Schema({ lat: String, longt: String, name: String }, {collection: ''WeatherCollection''}); const windSchema = new Schema({ windGust: String, windDirection: String, windSpeed: String }, {collection: ''WeatherCollection''}); //Then define discriminator field for schemas: const baseOptions = { discriminatorKey: ''__type'', collection: ''WeatherCollection'' }; //Define base model, then define other model objects based on this model: const Base = mongoose.model(''Base'', new Schema({}, baseOptions)); const CoordinateModel = Base.discriminator(''CoordinateModel'', coordinateSchema); const WindModel = Base.discriminator(''WindModel'', windSchema); //Query normally and you get result of specific schema you are querying: mongoose.model(''CoordinateModel'').find({}).then((a)=>console.log(a));

Ejemplo de salida:

{ __type: ''CoordinateModel'', // discriminator field _id: 5adddf0367742840b00990f8, lat: ''40'', longt: ''20'', name: ''coordsOfHome'', __v: 0 },