【问题标题】:multi updating a key along the documents of a collection using pymongo使用 pymongo 沿集合的文档多次更新密钥
【发布时间】:2017-08-23 09:09:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    你有两个问题。首先,valor 不是 Python 代码中的标识符,它是 MongoDB 文档的字段名称。您需要在 Python 中用单引号或双引号将其引用,以使其成为字符串并在 PyMongo 更新表达式中使用。

    您的第二个问题是,MongoDB 的 update 命令不允许您将一个字段设置为另一个字段的值,也不允许重命名字段。但是,您可以使用带有$project 阶段的aggregate 命令重塑集合中的所有文档,并使用$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())
    

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 2021-06-22
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多