Node.js mongoose父模型字段udpate的良好实践
我有3个模型具有这种关系: 课程==>[章节]==>测验 i、 例如,我的课程模型包含引用章节文档的Node.js mongoose父模型字段udpate的良好实践,node.js,mongoose,Node.js,Mongoose,我有3个模型具有这种关系: 课程==>[章节]==>测验 i、 例如,我的课程模型包含引用章节文档的ObjectId数组,我的章节模型包含引用测验文档的ObjectId 在我的课程模式定义中,我有一个lastUpdated字段,用于存储上次修改课程的日期 架构定义如下所示: 课程模式: let courseScheme = mongoose.Schema( { title: { type: String, required: true }, nbChapt
ObjectId
数组,我的章节模型包含引用测验文档的ObjectId
在我的课程模式定义中,我有一个lastUpdated
字段,用于存储上次修改课程的日期
架构定义如下所示:
课程模式:
let courseScheme = mongoose.Schema(
{
title: { type: String, required: true },
nbChapters: { type: Number, default: 0 },
chapters: { type: [mongoose.Schema.Types.ObjectId], default: [], ref: 'Chapter' },
lastUpdated: { type: Date, default: Date.now() }, // I want this field to be updated if I create/update/delete a reference or a transitive reference of this document
}
);
第二章模式:
let chapterScheme = mongoose.Schema(
{
chapterName: {type: String, required: true},
chapterIndex: {type: Number, required: true}, // used to sort chapters on client side (for ex: in navigation menu)
course: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Course' },
quizzId: {type: mongoose.Schema.Types.ObjectId, ref: 'Quiz'},
// some more fields
}
);
测验模式:
let quizScheme = mongoose.Schema(
{
questions: [
{
questionIndex: {type: Number, required: true}, // used to sort questions on client side
type: {type: String, required: true, enum: ['MultiSelect', 'Select', 'Input']},
question: {type: String, required: true}
// some more fields
},
]
}
);
我想知道,如果我修改了课程文档中的任何子项(直接/间接),是否有更新lastUpdated
字段的良好做法。例如,如果我在给定课程的章节中添加了一个新的测验参考,如何更新相应课程的lastUpdated
字段
我想做以下几件事:
- 每次更新/保存课程的新子文档时,使用挂钩更新此字段
- 直接查询父课程,并在需要时更新其字段
PS:我不是要用代码作为答案,只是想了解一下这类操作的常见良好做法。我想说有两种可能的方法:
在链接架构发生更改时更新
lastUpdated
字段。您对此有几种方法(您提到的一些)
- 使用2个操作(2个请求/2个操作):更新
而不是更新章节
课程
- 使用钩子(也包括2个请求/2个操作)
- 使用批处理/更新(1个请求,2个操作):这将是最有效的,因为您只向MongoDB发送一个传出请求。但是,MongoDB服务器上仍有2个操作
如果对另一个集合进行了更改,则不要更新
课程
集合上的上次更新的
字段。相反,在所有相关集合上保留一个lastUpdated
字段,并在查询时选择最近的日期。
示例
查询数据时,对两个集合、
章节和课程
使用$lookup
聚合。在结果中,选择最近的lastUpdated
日期-从课程
或从章节
中选择
希望这有帮助谢谢你的回答,确实有帮助。我甚至不知道批量操作,并且将根据我的需要和我的应用程序/环境的上下文等,在所有方法之间进行选择。。。非常感谢。