我在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})
答案 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。这很容易。