Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PyMongo更新数组中的对象_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python 使用PyMongo更新数组中的对象

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

我想知道如何使用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"
         },
         {
            ....
         }     
      ]
}
然后,假设您传递了一个包含要更新的元素的自由裁量权。在此示例中,仅更新data1data3

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改为“点符号”形式。这就是答案,但我可能会花时间寻找一种有效的方法来实现这一点,它不会导致这里演示的愚蠢的复合连接。你知道,因为解决和解释基本问题是不可接受的。只有“复制和粘贴”代码对大多数人有效,对吗?不,我确实接受了你的回答,认为可以接受!:)我只是想让你知道,也许还有其他人在寻找这个!