Массовые операции MongoTemplate игнорируют ограничение

#spring #mongodb #bulk

#spring #mongodb #массовые

Вопрос:

У меня есть коллекция employees, которая выглядит так:

 {
_id
company_id
job_type
name
age
...
}
  

И запрос на удаление, который выглядит как:

 val criteria = Criteria.where("company_id").isEqualTo(companyId).and("job_type").isEqualTo(jobType)
val query = Query(criteria).limit(3)
  

Когда я запускаю его как:

 mongoTemplate.remove(query, null, "collection_name")
  

Это отлично работает 🙂

Покупайте, когда я запускаю его в массовых операциях, таких как:

 val bulkOp = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, null, "collection_name")
bulkOp.remove(query)
...
bulkOp.execute()
  

Он удаляет все документы для этой компании и типа задания, полностью игнорируя limit=3

Есть ли решение проблемы?

Комментарии:

1. Я думаю, ограничение применяется к результирующему курсору, который действителен для запроса, а не для операции удаления. С помощью этого метода можно настроить таргетинг на 3 отдельных документа mongoTemplate#remove(List<Query> removes) .

Ответ №1:

Массовая запись с параметрами курсора не поддерживается и противоположна тому, для чего предназначена массовая запись — курсор используется для итеративной обработки результатов и многократного обращения к серверу. С другой стороны, массовые обновления выполняются в пакетном режиме на стороне сервера.

Причина, по которой remove работает при использовании шаблона mongo, находится за сценой, которую он создает multiple queries для извлечения всех совпадений для запроса и получения идентификаторов, за которыми следует другой вызов для удаления этих идентификаторов.

Вы также можете сделать то же самое, собрав идентификаторы перед запуском запроса remove в mongodb для массового использования.

Комментарии:

1. Спасибо за ответ, насколько я понимаю, я просто не могу выполнить массовое удаление с ограничением? как я могу создать аналогичную операцию, используя как можно меньше обращений к серверу?

2. Np. Правильно. Как уже отмечалось, для удаления документов необходимо собрать все идентификаторы в исходном запросе, за которыми следует команда remove.

3. Дайте мне знать, если у вас возникнут дополнительные вопросы. Спасибо