MongooseJS:单独文件中的子记录模式

时间:2014-03-14 07:36:42

标签: node.js mongodb mongoose

假设我有一个名为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 个答案:

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