【问题标题】:PyMongo: JSON Keys getting updated in mongoPyMongo:在 mongo 中更新 JSON 密钥
【发布时间】:2016-10-07 00:40:49
【问题描述】:

我在更新 mongo 中的嵌套 json 结构时遇到了困难。 我正在使用 pymongo 和 Mongoengine-Rest-framework。

由于这个特殊的 json 具有动态结构并且是高度嵌套的,因此我选择使用 pymongo 而不是 mongo-engine ORM。

创建、检索和删除操作运行良好。 我想对更新问题提出一些建议。

让我们考虑一个已经存在于 mongo 中的示例对象:

st1 = {
        "name": "Some_name",
        "details": {
                    "address1": {
                        "house_no": "731",
                        "street": "Some_street",
                        "city": "some_city"
                            "state": "some_state"
                        }
                }
        }

如果我尝试通过在更新命令中发送 json st2 来将 address2 添加到详细信息中来更新 st1,其中 _id 是更新的条件,

st2 = {
        "details": {
                    "address2": {
                        "house_no": "5102",
                        "street": "Some_street",
                        "city": "some_city"
                            "state": "some_state"
                        }
                }
        }

我得到以下对象 st3 作为结果,在 mongo 中,

st3 = {
        "name": "Some_name",
        "details": {
                    "address2": {
                        "house_no": " 5102",
                        "street": "Some_street",
                        "city": "some_city"
                            "state": "some_state"
                        }
                }
        }

而不是预期的 st4 对象。

st4 = {
        "name": "Some_name",
        "details": {
                    "address1": {
                        "house_no": "731",
                        "street": "Some_street",
                        "city": "some_city"
                            "state": "some_state"
                        },
                    "address2": {
                        "house_no": "5102",
                        "street": "Some_street",
                        "city": "some_city"
                            "state": "some_state"
                        }
                }
        }

我的更新命令是:

result = collection.update_one({'_id': id}, doc)

在哪里

id: 文档的_id

文档:(此处)st2

collection: pymongo 集合对象

原始 JSON 深度为 6,键是动态的。需要在不同的深度进行更新。

【问题讨论】:

标签: python json mongodb pymongo


【解决方案1】:

首先,将要更新的对象更改为:

to_update = {
   "house_no": "5102",
   "street": "Some_street",
   "city": "some_city",
   "state": "some_state"
}

然后用它来更新你想要的文档的特定部分:

collection.update_one({_id: id}, { '$set': {"details.address2" : to_update} });

【讨论】:

    【解决方案2】:

    用这个来添加地址2:

    collection.update({'_id': ObjectId(doc_id)}, {'$set': {'details.%s' % 'address2': address2}}, upsert=True)

    结帐完整代码:

    import pymongo
    from bson.objectid import ObjectId
    
    data = {"name": "Some_name",
           "details": {"address1": {"house_no": "731", "street": "Some_street", "city": "some_city", "state": "some_state"}}}
    
    address2 = {"house_no": "731", "street": "Some_street", "city": "some_city", "state": "some_state"}
    
    connect = pymongo.MongoClient('192.168.4.202', 20020)
    database = connect['my_test']
    collection = database['coll']
    
    # # CREATE COLLECTIONS AND INSERT DATA
    # _id = collection.insert(data)
    # print _id
    
    doc_id = '57568aa11ec52522343ee695'
    
    collection.update({'_id': ObjectId(doc_id)}, {'$set': {'details.%s' % 'address2': address2}}, upsert=True)
    

    【讨论】:

    • 当键是动态的并且在不同的深度时它不会工作。我已经更新了问题。
    • @Shipra - 您的密钥可以是动态的,而不是使用任何密钥名称的“address2”变量。如果你想比使用 'details.%s.%s.%s' % ('var1', 'var2', 'var3') 更深入。
    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多