MongoDB - 更新嵌套数组

时间:2015-12-23 08:24:55

标签: mongodb updates

{
  "_id": "xPBc4By8FemDwTPqH",
  "u": {
    "_id": "6PoZawHZcQz4Gwzcv",
    "username": "michael"
  },
  "friends": [
    {
      "u": {
        "_id": "eGqDjAjjtYADbuSnn",
        "username": "michael",
        "name": "michael"
      }
    },
    {
      "u": {
        "_id": "k4gKCGwYryXDMMHvs",
        "username": "joyce",
        "name": "joyce"
      }
    }
  ]
}

我想更新“friends.u.username”的名称:“michael”的名字是“你好”,我需要怎么做。

4 个答案:

答案 0 :(得分:42)

$set运算符与更新中的$ positional operator一起应用以更改name字段。

$ positional operator将标识要更新的数组中的正确元素,而不显式指定数组中元素的位置,因此最终更新语句应如下所示:

db.collection.update(
    { "friends.u.username": "michael" }, 
    { "$set": { "friends.$.u.name": "hello" } }
)

答案 1 :(得分:4)

您可以使用$ set运算符。

> db.test.update({"friends.u._id":"eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

答案 2 :(得分:1)

以下应该可以正常工作

首先检查数组的当前值。

db.test.findOne({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{"friends.u.name":1})

现在启动更新命令

db.test.update({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{$set:{"friends.$.u.name":"hello"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

现在再次检查结果以验证更新值

db.test.findOne({"friends.u.id" : "eGqDjAjjtYADbuSnn"},{"friends.u.name":1})

希望这会有所帮助。

答案 3 :(得分:0)

如果你使用的是 python,我创建了这个函数来生成新的更新:

def generate_set_to_update_document(field: str, changes: dict) -> dict:
    new_set = {}
    for change in changes.keys():
        new_set[f"{field}.$.{change}"] = changes[change]
    return new_set