热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用PyMongo更新数组内的对象

如何解决《使用PyMongo更新数组内的对象》经验,为你挑选了1个好方法。

我想知道如何通过选择文档(行)然后进入嵌套数组并选择特定对象来更新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"
             },
             {
                ....
             }     
          ]
    }

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 }
)

因此,它将$从更新的查询部分转置到实际匹配的元素位置.匹配的数组元素将被更新并使用"点表示法",只会影响上述字段.

不知道在这种情况下"服务"应该是什么意思,我只是将其视为"转录错误",因为你显然是在尝试匹配数组元素.

这可能更干净,但这应该给你一般的想法.


推荐阅读
author-avatar
文布得
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有