如果$ unset数组不存在,MongoDB不会抛出

时间:2018-12-22 13:57:15

标签: mongodb mongoose

我有这样的更新操作:

await project.update({
  $pull: {
    languages: { _id: ObjectId(languageId) },
  },
  $unset: {
    [`entries.$[].${languageId}`]: 1,
  },
  $set: {
    revisions: project.revisions,
  },
});

但是如果entries数组不存在,则会引发错误:

name: 'MongoError',
index: 0,
code: 2,
errmsg: "The path 'entries' must exist in the document in order to apply array updates.",

是否有一种方法可以设置是否存在,但如果不存在则不抛出错误?

1 个答案:

答案 0 :(得分:1)

您可以在Model级别上运行它,而不必在update文档上运行project,并使用$exists运算符为entries字段添加附加条件:

Project.updateOne({ _id: project._id, entries: { $exists: true } } , {
    $pull: {
        languages: { _id: ObjectId(languageId) },
    },
    $set: {
        revisions: project.revisions,
    },
    $unset: {
        [`entries.$[].${languageId}`]: 1
    }
});

问题在于,当没有entries时,该文档将不匹配,并且上述任何操作都将不会执行。

您还可以尝试在查询中添加$unset部分,以检查project.entries是否未定义,但是如果其他一些线程将删除entries数组,则需要为这些错误做好准备同时。