假设我有一个名为LeagueSchema的模式,它需要包含一些关于联盟的一般信息(例如名称,创建的时间等),以及一些更复杂的对象(例如成员资格)。因为在联盟之外不需要这些会员资格,所以我认为他们不必成为他们自己的收藏品。但是,我认为为了模块化,最好将这些模式存放在各自独立的文件中。
它看起来像这样:
league.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var LeagueSchema = new Schema({
created: {
type: Date,
default: Date.now
},
updated: {
type: Date,
default: Date.now
},
name: {
type: String,
default: '',
trim: true
},
memberships: [MembershipSchema]
});
membership.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var MembershipSchema = new Schema({
startDate: {
type: Date,
default: Date.now
},
endDate: {
type: Date,
default: null
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
不幸的是,这不起作用。我收到以下错误:
ReferenceError:未定义MembershipSchema
这显然正在发生,因为LeagueSchema依赖于MembershipSchema,但我不确定包含它的最佳方式是什么。我能以某种方式将其定义为依赖吗?或者我应该只包含文件?
另外,以这种方式使用子文档是不好的做法?是否有任何理由让所有这些对象都存在于他们自己的集合中?
答案 0 :(得分:1)
您的membership.js
文件应导出架构,league.js
文件应导入该架构。那么你的代码应该可以工作。
在membership.js
向底部添加:
module.exports = MembershipSchema;
在league.js
中,添加
var MembershipSchema = require('membership.js');
答案 1 :(得分:1)
在您的membership.js中,将成员资格子文档架构导出为模块:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var MembershipSchema = new Schema({
startDate: {
type: Date,
default: Date.now
},
endDate: {
type: Date,
default: null
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
module.exports = MembershipSchema;
然后,您可以在LeagueSchema
文档中要求导出的模块架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var MembershipSchema = require('./membership');
var LeagueSchema = new Schema({
created: {
type: Date,
default: Date.now
},
updated: {
type: Date,
default: Date.now
},
name: {
type: String,
default: '',
trim: true
},
memberships: [MembershipSchema]
});
要回答第二个问题,作为一般规则,如果您的模型在模型的各个部分中重复使用,那么在单独的文件中为子文档定义单独的模式可能会很有用,因此您不必不得不复制自己。一个很好的例子是当您在多个模型中使用子文档,或者在模型中有两个需要区分但仍具有相同子文档结构的字段时。
如果您的成员资格未在其他地方使用,则将模式视为嵌入式文档(具有自己的模式的文档,该模式是另一个文档的一部分,例如数组中的项目):
示例定义和初始化:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var MembershipSchema = new Schema({
startDate: {
type: Date,
default: Date.now
},
endDate: {
type: Date,
default: null
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
var LeagueSchema = new Schema({
created: {
type: Date,
default: Date.now
},
updated: {
type: Date,
default: Date.now
},
name: {
type: String,
default: '',
trim: true
},
memberships: [MembershipSchema]
});
mongoose.model('League', LeagueSchema);