有没有办法更新或设置文件的upsert等字段?

时间:2016-09-03 04:01:28

标签: javascript mongodb meteor

如果我想要更新某个文档,或者如果它不存在则添加它,那就是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类型的操作无法用于此目的,以最便宜(但仍然安全)的方式进行此操作的好方法是什么?

2 个答案:

答案 0 :(得分:0)

如果文档不存在,您可以使用$addToSet在数组中添加文档。

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

或者,您可以使用两步操作进行更新$push,然后RewriteEngine on RewriteRule ^content-(.*)$ ./get_content.php?url=$1 。如果存在,它将删除它,然后它将通过推送添加新数据,否则,它将只是推送。

答案 1 :(得分:-1)

我目前正在这样做:

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}}})
        }
    }
)

我想,它相当不错。如果有人有更好的方法,请告诉我们!