#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. Дайте мне знать, если у вас возникнут дополнительные вопросы. Спасибо