MongooseJS:独立文件中的子文档模式

4
假设我有一个名为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,但我不确定最佳的包含它的方法。我能否以某种方式将其定义为依赖项?或者我只需包含该文件?
此外,使用子文档是否是不良实践?有什么理由让所有这些对象都存在于自己的集合中更好吗?
2个回答

2
你的membership.js文件应该导出模式,你的league.js文件应该导入它。然后你的代码就可以工作了。
membership.js的末尾添加:
module.exports = MembershipSchema;

league.js中添加。
var MembershipSchema = require('membership.js');

1
请勿解释原文意思。 - a14m

2
在您的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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接