Python 使用PyMongo更新数组中的对象
我想知道如何使用PyMongo/MongoDB更新嵌套数组,方法是选择一个文档(行),然后进入嵌套数组并选择一个特定的对象Python 使用PyMongo更新数组中的对象,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我想知道如何使用PyMongo/MongoDB更新嵌套数组,方法是选择一个文档(行),然后进入嵌套数组并选择一个特定的对象 { "_id" : "12345", "name" : "John Doe, "mylist" : [ { "nested_id" : "1", "data1" : "lorem ipsum", "data2" : "stackover
{
"_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"
},
{
....
}
]
}
在更新部分中使用和位置运算符。还要转换您的输入以匹配键表示的“点符号”形式:
# 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 }
)
这将把$
从更新的查询部分转移到实际匹配的元素位置。匹配的数组元素将被更新,并且使用“点表示法”,只有提到的字段将受到影响
我不知道在本文中“服务”应该是什么意思,我只是将其视为一个“转录错误”,因为您显然是在尝试匹配位置上的数组元素
这可能会更干净,但这会给你一个大致的想法。尼尔,你好,谢谢你的回答!是的,你确实是对的,那“服务”是一个打字错误!我试过你的建议,但有一些错误。在循环中,它多次添加
mylist.$。
,除了索引[0]。所以它看起来像是mylist.$.mylist.$.mylist.$.data1:“data”
。但是,如果我创建一个空的dict,并将“新”项添加到该dict中,它就可以工作了。但是我想知道,如果你不使用你的方法,你是否可以做到这一点!:)@西格尔,对不起。您的意思是您在修改“dict”内容时遇到问题。为什么会这样?别难过,你已经帮了我很多。但我会尝试在这里写下错误。循环后的数据dict看起来像这样data={“mylist.$.data1:“new lorem”,“mylist.$.mylist.$.mylist.$.data2:“more data”,“mylist.$.mylist.$.mylist.$.data3:“goldeneye”}
正如您所看到的,它第一次添加得非常完美,但之后它只会继续添加更多@西格尔,该死。甚至没有测试该部分,可能偶然发现了一个关键的Python错误。除合同要求外,老实说,我几乎没有接触过语言。重点是将dict改为“点符号”形式。这就是答案,但我可能会花时间寻找一种有效的方法来实现这一点,它不会导致这里演示的愚蠢的复合连接。你知道,因为解决和解释基本问题是不可接受的。只有“复制和粘贴”代码对大多数人有效,对吗?不,我确实接受了你的回答,认为可以接受!:)我只是想让你知道,也许还有其他人在寻找这个!