使用PyMongo重命名嵌入式文档中的字段

时间:2018-09-27 10:14:51

标签: python mongodb mongodb-query pymongo

我在mongodb中有一个集合,我想重命名一些字段名称。我的收藏如下:

    {
    "_id": "",
    "user": "5a02d87ac12d314721bd9a15",
    "item": {
        "5b20db50a32c0e02693ffad6": {
            "item_value": [{
                "timepstamp": "",
                "value": 0.2
            }, {
                "timepstamp": "",
                "value": 0.8
            }, {
                "timepstamp": "",
                "value": 0.9
            }]
        },
        "843ujsafu88gfs88987898f": {
            "item_value": [{
                "timepstamp": "",
                "value": 0.2
            }, {
                "timepstamp": "",
                "value": 0.8
            }, {
                "timepstamp": "",
                "value": 0.9
            }]
        }
    }
}

我想重命名"5b20db50a32c0e02693ffad6""843ujsafu88gfs88987898f",它们是具有新值的项目之后的键,我可以说"12345x""12345y"

如何在pymongo中执行该查询?我可以使用以下代码从集合中检索值:

db = client['db']
collection = db['col']
res = collection.find({})

for item in res:
    items= item["item"]
    for key in items:
         print (key)
    ## collection.update({}, {$rename: {item["item"][key]: item["item"][new_item_id]}}, False, True)

该代码返回我要重命名的密钥。我该怎么办?

编辑:我尝试使用集合更新和方法重命名。似乎不起作用。如何仅更改该字段以及如何在此处正确使用pymongo?

EDIT2:      就我而言,我需要执行以下操作:

 _id = res['_id']
 item.pop('_id')   # this is imp
 _user = item['user']
 item.pop('user')   # this is imp

 collection.update({'_id': _id, 'user': _user }, {$set: item})

2 个答案:

答案 0 :(得分:2)

要重命名MongoDB中的字段,我们通常使用$rename更新操作,该操作也可以与embedded document一起使用。

from pymongo import MongoClient


uri = mongodb://127.0.0.1:27017"

old_fields_names = ["5b20db50a32c0e02693ffad6",
                    "843ujsafu88gfs88987898f"]
new_fields_names = ["12345x", "12345y"]
with MongoClient(uri) as client:
    db = client.db
    col = db.col
    update_doc = {f"item.{old}": f"item.{new}"
                  for old, new in zip(old_fields_names, new_field_names)}
    update = {"$rename": update_doc}
    col.update_many({}, update)

请注意使用上下文管理器(又称为 with语句)打开与数据库的连接,这确保在完成操作后关闭连接以避免资源泄漏。

答案 1 :(得分:1)

我认为您已经走了正确的一步,只剩下几步了。下面将工作。另外,我假设您已经有了要替换的键以及要替换的键的映射-

{
  "0": [
    {
      "filenames": [
        "a.txt",
        "b.txt",
        "c.txt"
      ]
    },
    {
      "cluster_number": 0
    },
    {
      "Top_Terms": [
        "would",
        "get",
        "like"
      ]
    }
  ],
  "1": [
    {
      "filenames": [
        "a.txt",
        "b.txt",
        "c.txt"
      ]
    },
    {
      "cluster_number": 0
    },
    {
      "Top_Terms": [
        "would",
        "get",
        "like"
      ]
    }
  ]
}

现在最后一个建议。不要使用上述方法,因为Loop内有DB查询是不好的。了解Pymongo文档中提供的BulkWrite。这很容易。