#python #mongodb #nosql #pymongo #robo3t
#python #mongodb #nosql #pymongo #robo3t
Вопрос:
input_values = [{"001":"john"},{"002":"Josh"}] (consider there are many dicts in this)
коллекция, подлежащая обновлению:
{
id : ObjectId("asasas87897s89as")
"name_id": "name1",
"name": ""
}
Мне нужно сопоставить ключ input_values dict с name_id коллекции и обновить значение.
Код, который я пробовал:
for key, value in input_values.items():
self.client[collection].update({"name_id": key},
{"$set": {"name": value}},
upsert=False, multi=True)
Но это обновляет по одной записи за раз. Но мне нужно обрабатывать 500 записей одновременно. Я использую pymongo.
Ответ №1:
Вам нужно использовать подход bulkWrite:
Количество операций в каждой группе не может превышать значение maxWriteBatchSize базы данных. Начиная с версии MongoDB 3.6, это значение равно 100 000. Это значение отображается в поле isMaster.maxWriteBatchSize.
Это ограничение предотвращает проблемы с сообщениями об ошибках большого размера. Если группа превышает это ограничение, клиентский драйвер делит группу на меньшие группы с количеством записей, меньшим или равным значению предела. Например, при значении maxWriteBatchSize 100 000, если очередь состоит из 200 000 операций, драйвер создает 2 группы, каждая по 100 000 операций.
Используя библиотеку pymongo, вам нужно объединить обновления в список и выполнить операцию массовой записи. Вот несколько примеров для этого, просто чтобы увидеть идею массовых операций в pymongo:
from pymongo import UpdateOne, MongoClient
db = MongoClient()
input_values = [{"001": "john"}, {"002": "Josh"}]
updates = []
for value in input_values:
key = list(value.keys())[0]
updates.append(UpdateOne({'name': key}, {'$set': {'name': value[key]}}))
db.collection.bulk_write(updates)