Вопрос по mongodb – MongoDB индексы для $ elemMatch

9

Страница справки по индексам наhttp://www.mongodb.org/display/DOCS/Indexes не упоминает $ elemMatch, и, поскольку уже несколько дней добавляется индекс для моей коллекции объектов 2M +, я подумал:

Я делаю запрос как:

{ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } }

Если я добавлю индекс

{lc:1, group:1, indices.text:1, indices.pos:1}

сможет ли этот запрос с компонентом $ elemMatch полностью пройти через индекс?

Ваш Ответ

1   ответ
17

я представляю, что ваши документы выглядят примерно так:

{
    "_id" : 1,
    "lc" : "eng",
    "group" : "xyz",
    "indices" : [
        {
            "text" : "as",
            "pos" : 2
        }, 
        {
            "text" : "text",
            "pos" : 4
        }
    ]
}

Я создал тестовую коллекцию с документами этого формата, создал индекс и выполнил отправленный вами запрос с опцией .explain ().

Индекс используется должным образом:

> db.test.ensureIndex({"lc":1, "group":1, "indices.text":1, "indices.pos":1})
> db.test.find({ lc: "eng", group: "xyz", indices: { $elemMatch: { text: "as", pos: { $gt: 1 } } } }).explain()
{
    "cursor" : "BtreeCursor lc_1_group_1_indices.text_1_indices.pos_1",
    "isMultiKey" : true,
    "n" : NumberLong(1),
    "nscannedObjects" : NumberLong(1),
    "nscanned" : NumberLong(1),
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : NumberLong(0),
    "millis" : 0,
    "indexBounds" : {
        "lc" : [
            [
                "eng",
                "eng"
            ]
        ],
        "group" : [
            [
                "xyz",
                "xyz"
            ]
        ],
        "indices.text" : [
            [
                "as",
                "as"
            ]
        ],
        "indices.pos" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : "Marcs-MacBook-Pro.local:27017"
}

Документацию по функции .explain () можно найти здесь:http://www.mongodb.org/display/DOCS/Explain

.explain () может использоваться для отображения информации о запросе, включая информацию о том, какой (если есть) индекс используется.

Спасибо Марк - и да, мои документы выглядят так. Я заметил из объяснения, хотя этоindexOnly ложно Разве это не означает, что BSON нужно было распаковать и отсканировать, даже если все поля в индексе? Nic Cottrell
Я могу понять, что если бы я спросилdb.test.find({ lc: "eng", group: "xyz", "indices.text: "as", "indices.pos": { $gt: 1 } }}) без $ elemMatch нужно было бы сканировать объекты, но поскольку элементу elemMatch требуется тот же подобъект, который уже был бы в элементе индекса, не так ли? Nic Cottrell
Рад был помочь! IndexOnly невозможен с многоключевым индексом. Это связано с тем, что каждый вложенный документ имеет свою собственную запись в индексе. Все "индексы" массив не хранится в одной записи индекса. Поэтому, даже если индекс используется, фактические документы должны быть прочитаны. Это объясняется в разделе «Точное сопоставление массива с индексом». раздел & quot; Multikeys & quot; документация:mongodb.org/display/DOCS/Multikeys
Индекс используется для этого запроса. Сканирование коллекции не выполняется. Мы знаем, что индекс используется, потому что он указан в «курсоре» поле. & quot; Только индекс & quot; просто означает, что возвращенные данные полностью находятся в индексе, а сами документы не нужно читать. Это невозможно с многоключевым индексом согласно моему предыдущему комментарию. Более подробная информация об этом содержится в разделе «Покрываемые индексы». раздел & quot; Получение подмножества полей & quot; документация.mongodb.org/display/DOCS/…

Похожие вопросы