Вопрос: pymongo update_one (), upsert = True без использования операторов $


У меня есть документы в форме:

{"hostname": "myhost1.com", "services": { ... } }

Я хотел бы сделать следующее:

dataset = requests.get('http://endpoint.com/hardware.json').json()
for hostname, services in dataset[0].items():
    db.titleHardware.update_one({'hostname':hostname},
                                {services.keys()[0]: services.values()[0]}, 
                                True) #upsert

Однако, я получаю следующую ошибку:

ValueError: обновление работает только с операторами $

Есть ли способ выполнить это обновление всего "services" кусок, основанный на "hostname" (и, в конечном счете, вставить новый документ, если hostname не существует)? Я знаю, что могу написать логику, чтобы сравнить то, что в моем MongoDB с тем, что я пытаюсь обновить / вставить, но я надеялся, что может быть что-то уже в pymongo или что-то, что я мог бы использовать для этого.


4


источник


Ответы:


Используйте replace_one для замены документов.

for hostname, services in dataset[0].items():
    db.titleHardware.replace_one({'hostname':hostname},
                                 {'hostname':hostname,
                                  services.keys()[0]: services.values()[0]}, 
                                 True)

4



Вы посмотрели документацию mongodb для updateOne ? Вы должны указать оператора обновления, такого как $set:

for hostname, services in dataset[0].items():
    db.titleHardware.update_one({'hostname':hostname},
                                {'$set': {services.keys()[0]: services.values()[0]}}, 
                                upsert=True)

3