设置特定子元素mongodb的值

时间:2016-02-05 15:38:22

标签: mongodb

我有以下数据库:

> db.test.find().pretty()
{
    "_id" : ObjectId("56b4c13d7db9acd913ce6e08"),
    "state" : "helloworld",
    "items" : [
        {
            "guid" : 123,
            "uniqueId" : 0
        },
        {
            "guid" : 124,
            "uniqueId" : 1
        }
    ]
}

我希望将guid字段的items.uniqueId = 1设置为125,以便结果为:

{
    "_id" : ObjectId("56b4c13d7db9acd913ce6e08"),
    "state" : "helloworld",
    "items" : [
        {
            "guid" : 123,
            "uniqueId" : 0
        },
        {
            "guid" : 125,
            "uniqueId" : 1
        }
    ]
}

我试过了:

> db.test.update( {'items.uniqueId' : 1} , { $set : { 'items.guid' : 125 }} )
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "cannot use the part (items of items.guid) to traverse the element ({items: [ { guid: 123.0, uniqueId: 0.0 }, { guid: 124.0, uniqueId: 1.0 } ]})"
    }
})

我做错了什么?

1 个答案:

答案 0 :(得分:1)

$set运算符与更新中的 $ positional operator 一起应用以更改guid字段。 $ positional operator 将标识要更新的数组中的正确元素,而不显式指定元素在数组中的位置,因此最终的更新语句应如下所示:

db.collection.update({ "items.uniqueId": 1 }, 
    {
        "$set": {
            "items.$.guid": 125
        }
    }
)

如果您想将该值增加1,请使用 $inc 更新运算符

db.collection.update({ "items.uniqueId": 1 }, 
    {
        "$inc": {
            "items.$.guid": 1
        }
    }
)