簡體   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