给出了
的mongodb数据{
"_id" : ObjectId("552f283dd951e49c6f2f451d"),
"uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
"sub" : [
{
"prod" : 30,
"var" : 0,
"status" : "Test",
"files" : [
{
"filePath" : "20150415/2-1/21001429153881552f2859699769.82145796.jpg"
},
{
"filePath" : "20150415/2-1/21001429153880552f28589ca9a8.67013013.jpg"
}
]
},
{
"prod" : 10,
"var" : 0,
"status" : "Pending",
"files" : []
}
],
"process_marker" : 3
}
我想更新&#34; sub.status&#34;的状态。在哪里&#34; uuid&#34; :&#34; 1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5&#34;,&#34; sub.prod&#34;:10,&#34; sub.prod&#34;:0 < / p>
通常我们会使用&#34; $&#34;修改结果索引,如下所示:
use targetDB
db.collection.update({
"uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
"sub.prod":10,
"sub.var":0
},{
"$set":{"sub.$.status":"MyNewValue"}
})
==== BUT THE CODE ABOVE DOES NOT UPDATE THE CORRECT $ TARGET ====
它会更新&#34; prod&#34;:30,&#34; var&#34;:0设置......为什么会这样?
如果我们限制两个键值对的查询条件,如下所示,更新正确的数组
use targetDB
db.collection.update({
"uuid" : "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
"sub.prod":10
},{
"$set":{"sub.$.status":"MyNewValue"}
})
==== THE CODE ABOVE UPDATES THE CORRECT $ TARGET ====
我很困惑,更详细的查找查询会导致更新错误的数组。这是一个错误还是我做错了什么?
MongoDB版本:3.0.2
答案 0 :(得分:4)
mongoDB中没有错误,您的查询中的问题是您使用的是第一个匹配"sub.prod":10
然后"sub.var":0
,但在更新时,您需要使用最新值"sub.var":0
获取和匹配第一个匹配数组"sub.var":0
,为什么它只更新"prod" : 30
数组元素。更多参考。 click here。
在这种情况下,您应该使用具有$elemMatch
条件的mongo $and
,如下所示
db.collectionName.update({
"uuid": "1-2-1-b95a4040-e29d-11e4-bce8-0381ce4bc8a5",
"sub": {
"$elemMatch": {
"$and": [{
"prod": 10
}, {
"var": 0
}]
}
}
}, {
"$set": {
"sub.$.status": "MyNewValue"
}
})