Как обновить 500 записей одновременно в mongodb с помощью python?

#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)