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