【问题标题】:Use more than one schema per collection on mongodb在 mongodb 上每个集合使用多个模式
【发布时间】:2013-01-05 09:45:14
【问题描述】:

我想在 mongodb 中为每个集合使用多个模式,如何使用它....?
当我尝试运行它时,它给了我这个错误:

错误:

OverwriteModelError:编译后无法覆盖allUsers 模型。
OverwriteModelError: 编译后无法覆盖checkInOut 模型。


这是我的 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
   };

【问题讨论】:

    标签: node.js mongodb mongoose schema-design nosql


    【解决方案1】:

    在猫鼬中你可以这样做:

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

    这两个架构将保存在“用户”集合中。

    有关更多信息,您可以参考文档:http://mongoosejs.com/docs/api.html#index_Mongoose-model 或者您可以查看以下gist,这可能会有所帮助。

    【讨论】:

    • 我给了他们相同的名字,但不知道集合的名称应该在第三个参数中。
    • 有什么建议可以搜索两种模式的对象吗?例如,我想查找用户和注册用户,并按日期排序,只使用查询。
    • Leg0,jQuery和这个有什么关系?
    • 这个答案对我有用,但我在视图模型中遇到问题是,在显示数据列表时,它会检索两种模式的数据。我想在不同列表中显示模式的数据而不在其他列表中重复?你能帮忙吗
    • 我认为这在保存方面是可行的,但由于它在技术上仍然是一个不同的猫鼬模型,你如何对将运行用户和注册用户的整个集合进行查询?
    【解决方案2】:

    我尝试了选择的答案,但是在查询特定模型对象时,它会检索两种模式的数据。所以我认为使用鉴别器会产生更好的解决方案:

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

    示例输出:

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

    【讨论】:

      【解决方案3】:

      当没有传递集合参数时,Mongoose 使用模型名称。如果您不喜欢这种行为,请传递集合名称、使用 mongoose.pluralize() 或设置您的模式集合名称选项。

      const schema = new Schema({ name: String }, { collection: 'actor' });
      
      // or
      
      schema.set('collection', 'actor');
      
      // or
      
      const collectionName = 'actor'
      const M = mongoose.model('Actor', schema, collectionName)
      

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多