web-dev-qa-db-fra.com

Utilisez plus d'un schéma par collection sur mongodb

Je voulais utiliser plus d'un schéma par collection dans mongodb, comment l'utiliser ....?
Cela me donne cette erreur lorsque j'essaye de l'exécuter:

Erreur:

OverwriteModelError: Impossible de remplacer le modèle allUsers une fois compilé.
OverwriteModelError: Impossible d'écraser le modèle checkInOut une fois compilé.


Voici mon schéma.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
   };
30
TaLha Khan

Dans mangouste, vous pouvez faire quelque chose comme ça:

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

Ces deux schémas permettront d'économiser sur la collection "utilisateurs".

Pour plus d'informations, vous pouvez vous référer à la documentation: http://mongoosejs.com/docs/api.html#index_Mongoose-model ou vous pouvez voir ce qui suit Gist il pourrait Aidez-moi.

55
Julián Duque

J'ai essayé la réponse sélectionnée mais lors d'une requête sur un objet de modèle spécifique, elle récupère les données des deux schémas. Je pense donc que l'utilisation d'un discriminateur donne une meilleure solution:

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));

Exemple de sortie:

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