python - 使用 PyMongo 更新数组中的对象

标签 python mongodb mongodb-query pymongo

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

最佳答案

使用 "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 }
)

因此,这会将 $ 从更新的查询部分转换为实际匹配的元素位置。匹配的数组元素将被更新,并且使用“点表示法”只有提到的字段会受到影响。

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

这可能更干净,但这应该会给你一个大致的想法。

关于python - 使用 PyMongo 更新数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828825/

相关文章:

python - 在 KDE 上为 Python 导入 Gtk 类型库

javascript - 如何更新嵌套的 mongo 对象

c# - 在 mongodb 中,获取第一个和最后一个文档的最有效方法是什么

java - 使用吗啡按字符串列表上的元素查询 MongoDB

python - 使用 pkg_resources 时以通用换行模式打开文件?

python - 使用 ElementTree 解析嵌套的无界 XML 字段

python - TensorFlow:在我自己的图像上进行训练

node.js - 具有一对多关系的 Mongoose 文档引用

java - 如何从java集合中的java对象访问变量?

mongodb - 如何计算mongodb中嵌套文档的出现次数?