gpt4 book ai didi

node.js - Mongoose JS : Subdoc Schemas in Separate Files

转载 作者:可可西里 更新时间:2023-11-01 09:14:22 25 4
gpt4 key购买 nike

假设我有一个名为 LeagueSchema 的架构,它需要包含有关联赛的一些一般信息(例如名称、创建时间等)以及一些更复杂的对象(例如成员(member)资格)。因为这些成员(member)在联盟之外是不需要的,所以我觉得没必要自己收藏。但是,我认为为了模块化,这些模式最好存在于它们自己的单独文件中。

它看起来像这样:

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 is not defined

这显然是因为 LeagueSchema 依赖于 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'
}
});

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

关于node.js - Mongoose JS : Subdoc Schemas in Separate Files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com