【问题标题】:Using update_one to update nested dictionary in pymongo (python mongoDB)使用 update_one 更新 pymongo (python mongoDB) 中的嵌套字典
【发布时间】:2020-07-04 12:36:21
【问题描述】:

假设我有这个功能:

def insert_data(self, data, id):
    self.snapshots.update_one({'snapshot_id': id},
                              {'$set': {'topic': data}}, upsert=True) 

data 始终是具有单个条目(一个键值对)的字典。 每次调用此函数时,“数据”都会持有不同的密钥。 我希望每次调用都在“主题”下添加该键值对。

假设数据在第一次调用时为 {1:2},在第二次调用时为 {3:4}。 我想在两个电话之后有 {'topic': {1:2, 3:4}} 。 我该如何做到这一点?上面的函数覆盖了数据字典,所以只剩下最后一个(在这种情况下,我最终得到 {'topic': {3:4}})。

它一定没有那么复杂,但我无法让它正常工作。

【问题讨论】:

    标签: python database mongodb pymongo


    【解决方案1】:

    从 mongodb 4.2 版开始,您可以使用 Updates with Aggregation Pipeline 新功能来获得您想要的结果。

    只需将括号 [] 放在更新周围,mongo 就可以使用聚合并实际更新文档。

    试试这样的:

    print(f'Document before update')
    pprint.pprint(coll.find_one())
    
    
    def insert_data(data, id):
        for key, value in data.items():
            coll.update_one({'snapshot_id': id}, 
                            [{'$set': {'topic': {str(key): value}}}])
    
    
    data_dict = {1: 6, 3: 8, 5: 6}
    
    for k, v in data_dict.items():
        insert_data({k: v}, 'Demo1')
    
        print(f'\nDocument after update')
        pprint.pprint(coll.find_one())
    

    结果:

    Document before update
    {'_id': ObjectId('5e799063caf64cd83bfda524'), 'snapshot_id': 'Demo1'}
    
    Document after update
    {'_id': ObjectId('5e799063caf64cd83bfda524'),
     'snapshot_id': 'Demo1',
     'topic': {'1': 6}}
    
    Document after update
    {'_id': ObjectId('5e799063caf64cd83bfda524'),
     'snapshot_id': 'Demo1',
     'topic': {'1': 6, '3': 8}}
    
    Document after update
    {'_id': ObjectId('5e799063caf64cd83bfda524'),
     'snapshot_id': 'Demo1',
     'topic': {'1': 6, '3': 8, '5': 6}}
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2015-08-27
      • 2021-12-05
      • 2021-07-02
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2020-12-24
      • 2022-01-25
      相关资源
      最近更新 更多