繁体   English   中英

使用 update_one 更新 pymongo 中的嵌套字典(python mongoDB)

[英]Using update_one to update nested dictionary in pymongo (python mongoDB)

假设我有这个功能:

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

data 始终是一个包含单个条目(一个键值对)的字典。 每次调用此函数时,'data' 都会保存一个不同的键。 我希望每次调用都在“主题”下添加该键值对。

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

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

从 mongodb 4.2 版开始,您可以使用更新与聚合管道新功能来获得您想要的结果。

只需将括号[]放在更新周围,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}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM