【问题标题】:mongoose schema check if model instance is saved for the first time猫鼬模式检查模型实例是否第一次保存
【发布时间】:2014-02-16 10:26:39
【问题描述】:

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

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') 钩子解决这个问题,如下所示:

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') 挂钩,以在它们各自的父模式中添加它们的 _id


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

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

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

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

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

【讨论】:

  • 我本来打算抱怨你回答中的第一句话,认为这样回答某人有点粗鲁,然后意识到这是你自己的问题哈哈,干杯!谢谢!
  • 应该有一个 init 钩子可以添加到模型中,但看起来该功能已损坏:/ github.com/Automattic/mongoose/issues/2363
猜你喜欢
  • 2020-09-05
  • 2020-06-29
  • 2016-01-21
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2018-08-27
相关资源
最近更新 更多