Я работаю над проектом. Где моему пользователю может потребоваться удалить 50 000+ (я имею в виду огромное количество документов, связанных с понравившимся постом, если пост будет удален, понравившиеся документы этого поста будут удалены) документов. Я видел, что это занимает огромное количество времени. Следует отметить, что моя коллекция документов Like имеет несколько индексов.
Мой вопрос: есть ли какой-либо другой способ удалить общее количество похожих документов 50 000+, или мне следует использовать поле маркировки удаления и поле TTL index
с помощью операции обновления, или есть ли другой ручной способ, который может запланировать операцию удаления документов из внешнего источника?
К сожалению, обновление 55485 документов занимает 15,3 секунды, а удаление этих файлов занимает 6 минут + .
В моем тесте like collection
у меня 20 миллионов документов. Тем не менее, это очень плохая производительность на локальном хост-сервере базы данных.
Структура документа:
{
"_id" : 2,
"date" : ISODate("2019-07-17T14:30:41.155Z"),
"isPresent" : false,
"tags" : [
"9301",
"8175",
"1374"
],
"userId" : 9969
}
Индексы
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"tags" : 1
},
"name" : "tags",
"background" : false
},
{
"v" : 2,
"key" : {
"isPresent" : 1
},
"name" : "isPresent",
"background" : false
},
{
"v" : 2,
"key" : {
"userId" : 1
},
"name" : "userId",
"background" : false
},
{
"v" : 2,
"key" : {
"date" : 1,
"isPresent" : 1
},
"name" : "dateAndIsPresent",
"background" : false
},
{
"v" : 2,
"key" : {
"isPresent" : 1,
"tags" : 1
},
"name" : "isPresentAndTags",
"background" : false
},
{
"v" : 2,
"key" : {
"removeTTl" : 1.0
},
"name" : "removeTTl_1",
"expireAfterSeconds" : 30.0
}
]
50к не так уж и много. Сколько времени это займет и что вы ожидаете?
Я добавил больше информации к моему вопросу. К сожалению, обновление 55485 документов занимает 15,3 секунды, а удаление этих файлов занимает 6 минут + секунды. И обновление, и удаление занимают ужасное количество времени. В моем приложении я не могу допустить более 15 миллисекунд для любого фонового процесса. Даже 15 миллисекунд — это огромное время. Любая операция БД, превышающая эту, должна обрабатываться по-другому.
вы выдаете 50 тыс. команд удаления или 1 команду удаления? Пожалуйста, добавьте образцы документов и команду удаления, чтобы люди могли лучше понять, что происходит.
На операцию удаления одного документа требуется максимум 8 миллисекунд.
"Я не могу допустить более 15 миллисекунд" - правда? Вы можете использовать In-Memory Storage Engine или любую другую базу данных в памяти.
Как вы удаляете данные? Похоже, вы запускаете команду
deleteOne
50 тысяч раз, и это худшее, что вы можете сделать. ИспользуйтеdeleteMany
или Методы массовой операции@WernfriedDomscheit, я использовал
deleteMany
, 6 минут + результат этого.