MongoDB агрегат медленно с индексированным соответствием? - PullRequest
1 голос
/ 13 марта 2020

У меня есть коллекция A и несколько полей a, b, c, d ...

Если я сделаю:

db.A.aggregate([{$match: {a: true, b: false, c: false}, {$limit: 50}]) >> это быстро (0,1 с )

Теперь, если я сделаю

db.A.aggregate(
        [
            {
                $lookup: {
                    from: 'B',
                    localField: 'b',
                    foreignField: '_id',
                    as: 'b'
                }
            },
            {$match: {'b.d': true}},
            { $limit: 50 }
        ]
    )

Это займет около 1,5 с (много документов, я в порядке с 1,5 с)

Теперь, если я сделаю то же самое как и раньше, но просто добавив $ match (который должен использовать индексы ...):

db.A.aggregate(
        [
            {$match: {a: true, b: false, c: false}},
            {
                $lookup: {
                    from: 'B',
                    localField: 'b',
                    foreignField: '_id',
                    as: 'b'
                }
            },
            {$match: {'b.d': true}},
            { $limit: 50 }
        ]
    )

Это займет 10 секунд? Я очень запутался, почему.

PS: у меня есть индекс для всех этих полей.

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Неважно, я нашел проблему. У меня был индекс по всем полям, кроме одного, что замедляло мой запрос.

Я нашел его с помощью параметра {explain: true} и увидел, что он использует составной индекс, который не включает один полей.

Теперь я в порядке с запросом 1.5 с

0 голосов
/ 13 марта 2020

В вашем последнем случае ($match, $lookup, $match) вы используете $ match stage два раза. где, как и в других случаях, вы присоединяетесь к различным коллекциям, а затем отображаете соответствующие документы. Как вы сказали, что у вас есть индексированные столбцы, не могли бы вы сказать мне значение столбца, содержит ли он текст, номер et c.

...