用于更新mongodb数据的'$'索引有问题

时间:2015-04-20 11:07:37

标签: mongodb automatic-updates

给出了

的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

1 个答案:

答案 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"
}
})