{
"_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”的名字是“你好”,我需要怎么做。
答案 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