3

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

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

谢谢你的帮助!

4

3 回答 3

12

您可以像这样更新数组中单个项目的值(如果您知道它的索引):

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"}})
于 2013-09-17T18:31:57.070 回答
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"
        }
    ]
}
于 2013-09-17T18:32:46.560 回答
1

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

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

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

于 2013-09-17T18:32:52.633 回答