gpt4 book ai didi

node.js - Mongoose 模式检查模型实例是否第一次保存

转载 作者:IT老高 更新时间:2023-10-28 13:25:32 26 4
gpt4 key购买 nike

我有 3 个模式,其中 2 个有一个 .pre('save') Hook 将其 _id 推送到前一个模式中。您可以以包含主题、问题和评论的论坛为例

var topicSchema = new Schema({
arr: {type:[Schema.ObjectId], ref:'Question'},
});
var Topic = new mongoose.model('Topic', topicSchema);

var questionSchema = new Schema({
targetId: {type:Schema.ObjectId, ref:'Topic', required:true},
arr: {type:[Schema.ObjectId], ref:'Comment'},
});
var Question = new mongoose.model('Question', questionSchema);

var commentSchema = new Schema({
targetId: {type:Schema.ObjectId, ref:'Question', required:true},
});
var Comment = new mongoose.model('Comment', commentSchema);

现在对于我想要的上述模式:当我保存问题时,我想自动将问题的 _id 推送到其各自的 Topic.arr 以及当我保存评论时自动将其推送到其各自的 Question.arr

我尝试使用 .pre('save') 钩子(Hook)解决这个问题,如下所示:

function addPreSave (schema, idProperty, containerProperty) {
var modelName = schema.paths[idProperty].options.ref;
var model = mongoose.models[modelName];

schema.pre('save', function (next) {
model.findById(this[idProperty], function (err, doc) {
doc[containerProperty].push(this._id);
doc.save(next);
}.bind(this));
});
}

addPreSave(questionSchema, 'targetId', 'arr');
addPreSave(commentSchema, 'targetId', 'arr');

上述函数所做的一切(以及对它的 2 次调用)就是向 2 个模式中的每一个添加一个 .pre('save') 钩子(Hook),以添加它们的 _id 在它们各自的父级中。


问题:问题是现在,每次我保存评论时,它都会将其 id 推送到主题,但我实际上只想在第一次这样做。因此,在上面的示例中,如果您创建一个主题,然后为它创建一个问题,然后为该问题创建一个评论,则 Topic.arr 将有 2 个 id(两倍于问题的 _id),因为它会为问题保存一次,第二次是由评论的调用触发以保存问题

有没有人知道解决这个问题的方法,或者更具体地说,如果您知道如何在预保存 Hook 中确定这是不是第一次保存?

最佳答案

所以事实证明,如果你愿意进入谷歌的第二页,你可以找到任何问题的答案!

为每个名为 isNew 的文档定义了一个属性,它可以满足您的想象。因此,只需在方法中添加 if (!this.isNew) return next() 即可解决问题。

关于node.js - Mongoose 模式检查模型实例是否第一次保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21349410/

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