Использование update_one для обновления вложенного словаря в pymon go (python mongoDB) - PullRequest
0 голосов
/ 24 марта 2020

Предположим, у меня есть эта функция:

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

данные - это всегда словарь с одной записью (одна пара ключ-значение). каждый раз, когда эта функция вызывается, «данные» содержат разные ключи. Я хочу, чтобы каждый вызов добавлял эту пару ключ-значение в 'topi c'.

Допустим, данные равны {1: 2} при первом вызове и {3: 4} при втором. Я хочу получить {'topi c': {1: 2, 3: 4}} после двух звонков. Как мне этого добиться? Приведенная выше функция перезаписывает словарь данных, поэтому остается только последний (в этом случае я получаю {topi c ': {3: 4}}).

Это не должно быть так сложно но я не смог заставить его работать должным образом.

1 Ответ

0 голосов
/ 24 марта 2020

Начиная с версии 4.2 mongodb, вы можете использовать новую функцию Updates with Aggregation Pipeline , чтобы получить желаемые результаты.

Просто поставив скобки [] вокруг обновлений, можно mon go для использования агрегирования и фактического обновления документа.

Попробуйте что-то вроде этого:

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}}
...