【问题标题】:How can I separate mongoose subdocument into seperate files?如何将猫鼬子文档分成单独的文件?
【发布时间】:2014-11-10 21:36:52
【问题描述】:

region.server.model.js我想拥有

var RegionSchema = new Schema({    
  name: {type: String},
  user: {type: Schema.ObjectId, ref: 'User'},
  bases: [BaseSchema]
});

mongoose.model('Region', RegionSchema);

在另一个名为base.server.model.js的文件中我想要拥有

var BaseSchema = new Schema({    
  name: {type: String},
  region: {type: Schema.ObjectId, ref: 'Region'}
});

mongoose.model('Base', BaseSchema);

它正在崩溃

bases: [BaseSchema]
        ^    
ReferenceError: BaseSchema is not defined

我不知道在 mean.js 中如何关联或链接这两个文件。

谢谢!

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    这里的模型实际上是嵌入的,这意味着它是“模式”对象,而不是嵌入到“区域”模型中的“模型”。因此,您当前的多个文件的问题是您需要“导出”该对象,然后为您的其他模块“要求”它。

    一个典型的设置是这样的,稍微删节,只是调用文件base.js

    var Schema = require('mongoose').Schema;
    
    var BaseSchema = new Schema({
      name: { type: String },
      region: { type: Schema.ObjectId, ref: 'Region' }
    });
    
    module.exports = BaseSchema;
    

    当然还有另一个region.js

    var mongoose = require('mongoose'),
        Schema = mongoose.Schema,
        BaseSchema = require('./base');
    
    var RegionSchema = new Schema({
      name: { type: String },
      user: { type: Schema.ObjectId, ref: 'User' },
      bases: [BaseSchema]
    });
    
    module.exports = mongoose.model('Region', RegionSchema);
    

    您在哪里“需要”到您定义架构的路径。请注意,由于这是“嵌入”的,因此无需在此处为“base”定义“模型”,因为这些项目在同一“区域”集合中创建为“子文档”。

    如果您真的想要一个“引用”架构,其中“基础”项目在他们自己的集合中,那么您的定义不同:

    var mongoose = require('mongoose'),
        Schema = mongoose.Schema;
    
    var BaseSchema = new Schema({
      name: { type: String },
      region: { type: Schema.ObjectId, ref: 'Region' }
    });
    
    module.exports = mongoose.model( 'Base', BaseSchema );
    

    对于“地区”:

    var mongoose = require('mongoose'),
        Schema = mongoose.Schema;
    
    var RegionSchema = new Schema({
      name: { type: String },
      user: { type: Schema.ObjectId, ref: 'User' },
      bases: [{ type: Schema.ObjectId, ref: 'Base' }]
    });
    
    module.exports = mongoose.model('Region', RegionSchema);
    

    没有必要“要求”,因为“模型”已暴露给 mongoose 对象。

    还要注意,虽然您“可以”稍后使用 mongoose.model() 访问模型,但一般的良好做法是“导出”模型结果,以便您以后可以在其他模块中“要求”并准备好一个可以工作的对象与。

    【讨论】:

      【解决方案2】:

      您可以通过Model#schema 访问 Mongoose 模型的架构,因此您可以:

      // Ensure the base model is defined first.
      require('./base.server.model.js');
      
      var RegionSchema = new Schema({    
        name: {type: String},
        user: {type: Schema.ObjectId, ref: 'User'},
        bases: [mongoose.model('Base').schema]
      });
      
      mongoose.model('Region', RegionSchema);
      

      【讨论】:

        猜你喜欢
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2015-10-01
        • 1970-01-01
        • 2012-11-07
        • 2015-06-26
        • 1970-01-01
        相关资源
        最近更新 更多