我在集合中有很多文档。 集合中每个文档的结构如下:
{
"_id" : ObjectId(....),
"valor" : {
"AB" : {
"X" : 0.0,
"Y" : 142.6,
},
"FJ" : {
"X" : 0.2,
"Y" : 3.33
....
该集合目前有大约200个文档,我注意到valor
中的一个键名称错误。在这种情况下,我们会说" FJ"应该是" JOF"在该集合的所有文档中。
我很确定可以使用pymongo的update
功能更改所有文档中的密钥。我面临的问题是,当我访问在线文档https://docs.mongodb.com/v3.0/reference/method/db.collection.update/时,只解释了如何更改值(我希望保留它们当前的状态并仅更改密钥)。
这就是我的尝试:
def multi_update(spec_key,key_updte):
rdo=col.update((valor.spec_key),{"$set":(valor.key_updte)},multi=True)
return rdo
print(multi_update('FJ','JOF'))
但输出name 'valor' is not defined
。我以为我将使用valor.specific_key来访问相应的json
如何只在集合的文档中更新密钥?
答案 0 :(得分:0)
你有两个问题。首先,valor
不是Python代码中的标识符,它是MongoDB文档的字段名称。您需要在Python中用单引号或双引号引用它,以使其成为字符串并在PyMongo更新表达式中使用它。
你的第二个问题是,MongoDB的update
命令不允许你将一个字段设置为另一个字段的值,也不允许重命名字段。但是,您可以使用带有aggregate
阶段的$project
命令重新整理集合中的所有文档,并使用$out
阶段将结果存储在第二个集合中。
以下是一个完整的例子:
db = MongoClient().test
collection = db.collection
collection.delete_many({})
collection.insert_one({
"valor" : {
"AB" : {
"X" : 0.0,
"Y" : 142.6,
},
"FJ" : {
"X" : 0.2,
"Y" : 3.33}}})
collection.aggregate([{
"$project": {
"valor": {
"AB": "$valor.AB",
"FOJ": "$valor.FJ"
}
}
}, {
"$out": "collection2"
}])
这是危险的部分。首先,检查“collection2”是否具有所需的所有文档,并具有所需的形状。然后:
collection.drop()
db.collection2.rename("collection")
import pprint
pprint.pprint(collection.find_one())