如何将mongoose子文档分成单独的文件?

时间:2014-09-17 00:45:35

标签: javascript node.js mongodb mongoose nosql

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如何关联或链接这两个文件。

谢谢!

2 个答案:

答案 0 :(得分:3)

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

典型的设置是这样的,略有删节,只需调用文件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);

您通过指定架构的路径“需要”的位置。注意到这里因为这是“嵌入式”的,所以不需要在这里为“基础”定义“模型”,因为项目在同一“区域”集合中被创建为“子文档”。

如果你真的想在自己的集合中使用“基础”项目的“引用”模式,那么你定义不同:

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.model()访问模型,但通常可以“导出”模型结果,以便以后可以在其他模块中“需要”并准备好对象与...合作。

答案 1 :(得分:3)

您可以通过Model#schema访问Mongoose Model的架构,这样您就可以:

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