使用pymongo多次更新集合文档中的密钥

时间:2017-08-23 09:09:43

标签: mongodb pymongo

我在集合中有很多文档。 集合中每个文档的结构如下:

{
"_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

如何只在集合的文档中更新密钥?

1 个答案:

答案 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())