作者:文布得 | 来源:互联网 | 2023-05-19 17:09
我想知道如何通过选择文档(行)然后进入嵌套数组并选择特定对象来更新PyMongo/MongoDB的嵌套数组.
{
"_id" : "12345",
"name" : "John Doe,
"mylist" : [
{
"nested_id" : "1",
"data1" : "lorem ipsum",
"data2" : "stackoverflow",
"data3" : "james bond"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "stackoverflow",
"data3" : "james bond"
},
{
....
}
]
}
然后让我们说你通过自己想要更新的元素.在此示例中,仅更新data1和data3
data = {
"data1" : "new lorem",
"data3" : "goldeneye"
}
我尝试使用以下语法,但没有成功.
db.testing.find_and_modify(
query={"_id": "12345", 'mylist.nested_id' : "1"},
update={"$set": {'mylist' : data}})
更新后应该是什么样子
{
"_id" : "12345",
"name" : "John Doe,
"mylist" : [
{
"nested_id" : "1",
"data1" : "new lorem",
"data2" : "stackoverflow",
"data3" : "goldeneye"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "stackoverflow",
"data3" : "james bond"
},
{
....
}
]
}
Neil Lunn..
8
使用"点表示法"和更新部分中的位置运算符.同时转换输入以匹配键表示的"点表示法"形式:
# Transform to "dot notation" on explicit field
for key in data:
data["mylist.$." + key] = data[key]
del data[key]
# Basically makes
# {
# "mylist.$.data1": "new lorem",
# "mylist.$.data3": "goldeneye"
# }
db.testing.find_and_modify(
query = {"_id": "12345", 'mylist.nested_id' : "1"},
update = { "$set": data }
)
因此,它将$
从更新的查询部分转置到实际匹配的元素位置.匹配的数组元素将被更新并使用"点表示法",只会影响上述字段.
不知道在这种情况下"服务"应该是什么意思,我只是将其视为"转录错误",因为你显然是在尝试匹配数组元素.
这可能更干净,但这应该给你一般的想法.
1> Neil Lunn..:
使用"点表示法"和更新部分中的位置运算符.同时转换输入以匹配键表示的"点表示法"形式:
# Transform to "dot notation" on explicit field
for key in data:
data["mylist.$." + key] = data[key]
del data[key]
# Basically makes
# {
# "mylist.$.data1": "new lorem",
# "mylist.$.data3": "goldeneye"
# }
db.testing.find_and_modify(
query = {"_id": "12345", 'mylist.nested_id' : "1"},
update = { "$set": data }
)
因此,它将$
从更新的查询部分转置到实际匹配的元素位置.匹配的数组元素将被更新并使用"点表示法",只会影响上述字段.
不知道在这种情况下"服务"应该是什么意思,我只是将其视为"转录错误",因为你显然是在尝试匹配数组元素.
这可能更干净,但这应该给你一般的想法.