使用 PyMongo 更新数组中的对象
Updating an object inside an array with PyMongo
我想知道如何通过选择文档(行)然后进入嵌套数组并选择特定对象来使用 PyMongo/MongoDB 更新嵌套数组.
{
"_id" : "12345",
"name" : "John Doe,
"mylist" : [
{
"nested_id" : "1",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"data3" : "james bond"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"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" : "Whosebug",
"data3" : "goldeneye"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"data3" : "james bond"
},
{
....
}
]
}
在更新部分使用"dot notation"和位置运算符。同时转换您的输入以匹配键表示的 "dot notation" 形式:
# 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 }
)
所以这会将 $
转换为更新查询部分的实际匹配元素位置。匹配的数组元素将被更新,使用 "dot notation" 只有提到的字段会受到影响。
不知道 "service" 在此上下文中的含义,我只是将其视为 "transcribing error",因为您显然是在尝试匹配某个位置的数组元素。
这可能会更清晰,但这应该让您大致了解。
我想知道如何通过选择文档(行)然后进入嵌套数组并选择特定对象来使用 PyMongo/MongoDB 更新嵌套数组.
{
"_id" : "12345",
"name" : "John Doe,
"mylist" : [
{
"nested_id" : "1",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"data3" : "james bond"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"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" : "Whosebug",
"data3" : "goldeneye"
},
{
"nested_id" : "2",
"data1" : "lorem ipsum",
"data2" : "Whosebug",
"data3" : "james bond"
},
{
....
}
]
}
在更新部分使用"dot notation"和位置运算符。同时转换您的输入以匹配键表示的 "dot notation" 形式:
# 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 }
)
所以这会将 $
转换为更新查询部分的实际匹配元素位置。匹配的数组元素将被更新,使用 "dot notation" 只有提到的字段会受到影响。
不知道 "service" 在此上下文中的含义,我只是将其视为 "transcribing error",因为您显然是在尝试匹配某个位置的数组元素。
这可能会更清晰,但这应该让您大致了解。