Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose父模型字段udpate的良好实践_Node.js_Mongoose - Fatal编程技术网

Node.js mongoose父模型字段udpate的良好实践

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

我有3个模型具有这种关系:

课程==>[章节]==>测验

i、 例如,我的课程模型包含引用章节文档的
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
    日期-从
    课程
    或从
    章节
    中选择



  • 希望这有帮助

    谢谢你的回答,确实有帮助。我甚至不知道批量操作,并且将根据我的需要和我的应用程序/环境的上下文等,在所有方法之间进行选择。。。非常感谢。