是否有一种方法可以更新或设置字段,就像upsert对文档所做的那样

Is there a way to update or set fields like upsert does for documents?

本文关键字:upsert 就像 字段 文档 设置 一种 更新 方法 是否      更新时间:2023-09-26

如果我想更新一个存在的文档,或者添加它,如果它不存在,有upsert

但是,如果我想更新一个存在的字段,或者添加它,如果它不存在,该怎么办?

想象我的文档UserProfiles从一开始是这样的:

{
    _id: "c8fdu98JC",
    questions: []
}

但如果加上答案,也可以是这样的:

{
    _id: "c8fdu98JC",
    questions: [{questionId: "age", answerId: "b"}]
}

所以用户可以第一次点击一个答案或者改变主意选择一个不同的答案。我可以做一个upsert类型的操作来更新或设置这个字段吗?

,

UserProfiles.update({_id: userId,
    'questions.questionId': questionId},
    {$set: {'questions.$.answerId': answerId}})

只更新已经存在的

既然答案很可能是upsert类型的操作无法用于此目的,那么以最便宜(但仍然安全)的方式进行此操作的好方法是什么?

你可以使用$addToSet在数组中添加一个不存在的文档。

但是,由于没有与数组更新直接等效的方法,因此您需要在应用程序代码中处理更新(如果已经存在)。

或者,您可以使用两步操作来更新$pull$push。如果存在,它将删除它,然后通过push添加新数据,否则,它将简单地push

我正在做这个:

UserProfiles.update({_id: userId,
    'questions.questionId': questionId},
    {$set: {'questions.$.answerId': answerId}},
    function(error, result) {
        if (error || result === 0) {
            UserProfiles.update({_id: userId},
                {$addToSet: {questions: {questionId: questionId, answerId: answerId}}})
        }
    }
)

我想还不错。如果有人有更好的方法,请告诉我!

相关文章: