更新MongoDB中数组元素的值

时间:2013-09-17 18:12:37

标签: mongodb

我想知道如何更新数组“array_of_stuff”中“name”字段标识的元素之一的“value”字段。例如,我想将“name_of_thing_1”的值更新为“new_value_of_thing_1”。如何使用第二个参数(即更新参数) ONLY 更新命令。我正在重新使用内部编写的类库我无法控制更新命令的第一个参数(即查询参数)。这可能吗?

{
"array_of_stuff": [
    {
        "name": "name_of_thing_1",
        "value": "value_of_thing_1",           
    },
    {
        "name": "name_of_thing_2",
        "value": "value_of_thing_2",
    }
]
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:10)

您可以更新数组中单个项目的值(如果您知道其索引),如下所示:

db.stuff.update(/* query ... */, {$set:{"arrayname.<index>":new_value}})

如果您的数组包含文档,则可以在该索引处更新文档的特定字段,如下所示:

db.stuff.update(/* query ... */, {$set:{"array_of_stuff.0.value":"new_value_of_thing_1"}})

// If you could use the query parameter and knew something
// about the value in the array you wanted to change:
db.stuff.update({"array_of_stuff.value":"value_of_thing_1"}, {$set:{"array_of_stuff.$.value":"new_value_of_thing_1"}})

答案 1 :(得分:1)

看看此示例是否可以帮助您:

db.bruno.insert({"array": [{"name": "Hello", "value": "World"}, {"name": "Joker", "value": "Batman"}]})

db.bruno.update({"array.name": "Hello"}, {$set: {"array.$.value": "Change"}})

db.bruno.find().pretty()

输出:

db.bruno.find().pretty()
{
    "_id" : ObjectId("52389faaafd72821e7b25a73"),
    "array" : [
        {
            "name" : "Hello",
            "value" : "Change"
        },
        {
            "name" : "Joker",
            "value" : "Batman"
        }
    ]
}

答案 2 :(得分:1)

我认为不可能。为了更新数组中某个元素的字段,您应该使用位置$运算符,例如:

update({'array_of_stuff.name':'name_of_thing_1'}, 
       { $set: {'array_of_stuff.$.value':'new_value_of_thing_1'}})

但是according to documentation:位置$运算符充当与查询文档匹配的第一个元素的占位符,而数组字段必须作为查询文档的一部分出现