让我们说db中有一个这样的对象:
{
_id: <...>,
arrayOfObjects: [
{
criteria: "one",
value: 5
},
{
criteria: "two",
value: 5
},
{
criteria: "three",
value: 5
},
{
criteria: "four",
value: 5
},
]
}
我想要做的是运行类似于:
的更新{
$inc: {
"arrayOfObjects.2.value" : -1
}
}
但是我需要它只影响某些元素,例如{$或:[{criteria:“one”},{criteria:“three”}]} 我不能依赖数组索引,因为我执行更新之前可能已经过期的对象副本(可以在数组中插入,删除,重新排列对象)。
是否可以将其关闭?这样做的最佳方式是什么?
答案 0 :(得分:1)
您必须以两个单独的update
命令执行此操作,因为$
positional operator仅标识匹配的第一个数组元素:
db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'one'},
{'arrayOfObjects.$.value': {$inc: -1}})
db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'three'},
{'arrayOfObjects.$.value': {$inc: -1}})
答案 1 :(得分:0)
使用此查询
{$or: [{arrayOfObjects.criteria: "one"}, {arrayOfObjects.criteria: "three"}]}
对于 更新
编辑:
试试这个
collectionName.update({arrayOfObjects.criteria: "one"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);
collectionName.update({arrayOfObjects.criteria: "three"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);
此外,请查看此链接以获取有关 mongodb更新 的更多信息 http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29
编辑我的回答。
@JohnnyHK是对的。它需要2个查询。我的错。已经很晚了,我累了。)
答案 2 :(得分:0)
我不知道为什么你不能运行Michai的查询,因为在我看来这是正确的。所以我发布了我的答案。首先,您不能在一个查询中执行此操作。是的,听起来很荒谬,但事情就是这样:https://jira.mongodb.org/browse/SERVER-1243
在这里编写或提出这个问题是个好主意,可能在接下来的几个月里他们会解决这个问题。但从2010年后的创作时间来看,我非常怀疑: - (
所以这里有一些解决方法,你可以做到这一点: 首先,如果没有很多标准,那么使用多个查询就可以做到这一点:
db.coll.update({
_id: <...>,
'arrayOfObjects.criteria': 'Criteria 1'
}, {
'arrayOfObjects.$.value': {
$inc: -1
}
})
并按照不同的标准多次执行此操作。
但是如果标准太多,你可能会浪费太多的查询。因此,无论如何,您都可以在两个查询中执行此操作。
db.coll.find( {'arrayOfObjects.criteria' : { $in: ['one', 'three'] }})