猫鼬父模型场udpate的良好做法

时间:2019-02-01 12:54:57

标签: node.js mongoose

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

场==> [章] ==>测验

即,我有一个课程模型,其中包含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:我不是在要求代码作为答案,而只是暗示了这种操作的常见良好做法。

1 个答案:

答案 0 :(得分:1)

我想您有两种可能的方法:

  1. 更新数据库时的句柄
    在更改链接架构时更新lastUpdated字段。您有几种方法(您已经提到过)

    • 使用2个操作(2个请求/ 2个操作):更新chapters比更新courses
    • 使用一个钩子(也是2个请求/ 2个操作)
    • 使用批处理/ bulk更新(1个请求,2个操作):这将是最有效的,因为您仅向MongoDB发送一个外发请求。但是,MongoDB服务器上仍然发生2次操作。
  2. 查询数据库时的句柄
    如果对另一个集合进行了更改,请不要更新lastUpdated集合上的courses字段。而是在所有相关集合上保留一个lastUpdated字段,并在查询时选择最近的日期。

    示例
    在查询数据时,对两个集合$lookupchapters使用courses聚合。根据结果​​,从lastUpdatedcourses中选择最近的chapters日期。


希望这会有所帮助