Удаление огромного количества документов в mongodb

avatar
John
1 июля 2021 в 18:43
45
0
1

Я работаю над проектом. Где моему пользователю может потребоваться удалить 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
    }
    
]
Источник
Wernfried Domscheit
1 июля 2021 в 19:55
1

50к не так уж и много. Сколько времени это займет и что вы ожидаете?

John
2 июля 2021 в 06:19
0

Я добавил больше информации к моему вопросу. К сожалению, обновление 55485 документов занимает 15,3 секунды, а удаление этих файлов занимает 6 минут + секунды. И обновление, и удаление занимают ужасное количество времени. В моем приложении я не могу допустить более 15 миллисекунд для любого фонового процесса. Даже 15 миллисекунд — это огромное время. Любая операция БД, превышающая эту, должна обрабатываться по-другому.

Dĵ ΝιΓΞΗΛψΚ
2 июля 2021 в 06:31
0

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

John
2 июля 2021 в 06:42
0

На операцию удаления одного документа требуется максимум 8 миллисекунд.

Wernfried Domscheit
2 июля 2021 в 06:58
0

"Я не могу допустить более 15 миллисекунд" - правда? Вы можете использовать In-Memory Storage Engine или любую другую базу данных в памяти.

Wernfried Domscheit
2 июля 2021 в 07:02
0

Как вы удаляете данные? Похоже, вы запускаете команду deleteOne 50 тысяч раз, и это худшее, что вы можете сделать. Используйте deleteMany или Методы массовой операции

John
2 июля 2021 в 07:12
0

@WernfriedDomscheit, я использовал deleteMany, 6 минут + результат этого.

Ответы (0)