是否有一种方法可以更新或设置字段,就像upsert对文档所做的那样
Is there a way to update or set fields like upsert does for documents?
如果我想更新一个存在的文档,或者添加它,如果它不存在,有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}}})
}
}
)
我想还不错。如果有人有更好的方法,请告诉我!
相关文章:
- 在SVG地图上添加水的渐变,就像在谷歌地图(PHP/JS)中一样
- 我正在创建一个聊天,但每次我发送消息时,它都不会让我再发送另一条消息,就像表格一样;不起作用
- 如何用jquery动画改变背景颜色,就像一个过渡
- 为什么可以'我们在函数体中为函数对象添加属性,就像在javascript中为对象文字添加属性一样
- 我如何创建一个选择器,就像jQuery有jQuery()或$()一样
- jQuery动画的持续时间就像一个延迟
- 如何在javascript对象中设置属性的类型,就像mongoose模式设计一样
- 如何使用CSS或JQuery使整个网页看起来更小(就像Chrome的缩小功能一样)
- 为什么javascript函数名称custom是一个小写的单词,后跟一个大写的单词,就像'orangeCost'一样
- 适应.js就像Javascript的功能一样
- checkbox.attr(“checked”),就像句子子句一样
- 复制右键单击灯箱的操作,就像在github.com上一样
- 锚定标签功能强大,但滚动流畅赢得't工作;页面的行为就像javascript是'没有
- JAVASCRIPT-动画块消失,就像它出现时一样
- AngularJs的$scope就像一个本地变量
- 内容滑块就像幻灯片一样
- 如何绕过'那么's在承诺链中,就像传统的'return'陈述
- Protractor:如何从字符串中删除多余的空间,就像我们在javagetText.trim()中使用的那样
- Jquery/javascript方式发送50个表单,就像发送1个表单一样
- 是否有一种方法可以更新或设置字段,就像upsert对文档所做的那样