增加猫鼬中间件/钩子中 findOneAndUpdate 的数量

时间:2021-06-14 13:11:57

标签: mongoose mongoose-schema

我有一个包含一系列子文档的文档,我会对这些子文档进行某种版本控制,例如添加到此数组中的每个新子文档的编号都会增加。应该在每个单独的子文档上保存和增加版本,我认为最好的方法是在猫鼬中间件中做到这一点?

我写了这个,它按预期工作,但感觉有点麻烦,我想知道是否有更好更合适的方法来实现结果。

每次将新的子文档推送到 agreementInfo 数组时,我想要做什么都会增加 new 子文档版本字段上的版本。它将始终增加 1,并且永远不会删除任何子文档。

模型的相关部分

const Agreement = mongoose.Schema({
  ...
  agreementInfo: [
    {
      version: { type: Number, default: 0 },
      referencePrice: Number
      ....
      ]
    }   
})

预钩

Agreement.pre('findOneAndUpdate', async function (next) {
  const docToUpdate = await this.model.findOne(this.getQuery());

  const latestVersion = Math.max(
    ...docToUpdate.agreementInfo.map((info) => info.version)
  );

  this._update.$push.agreementInfo.version = latestVersion + 1;
  next();
});

初始文档创建

const agreement = new Agreement({
      ...
      agreementInfo: {
        version: 1,
        referencePrice: 1000
        ...
      },
    });

agreement.save()

添加新的子文档

const query = { _id: ObjectId(id) };
  const update = {
    $push: {
      agreementInfo: { referencePrice: 500 }, 
      // this will get version : 2 in the DB when using the pre hook
    },
  };

  await Agreement.findOneAndUpdate(query, update);

0 个答案:

没有答案