Подтвердить что ты не робот

Поддокументный индекс в монго

Что именно происходит, когда я вызываю ensureIndex(data), когда типичные данные выглядят как data:{name: "A",age:"B", job : "C"}? Будет ли он создавать составной индекс по этим трем полям или он будет создавать только один индекс, применимый, когда что-либо из данных запрашивается или что-то совсем другое?

4b9b3361

Ответ 1

Вы можете сделать либо:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

Это обсуждается в документации в indexes-on-embedded-fields и индексы на вспомогательные документы

Важным разделом раздела вспомогательного документа является "При выполнении совпадений равенства в поддокументах, порядок порядка полей и вложенные документы должны соответствовать точно."

Это означает, что два индекса одинаковы для простых запросов.

Однако, как показывает пример поддокумента, вы можете получить некоторые интересные результаты (которых вы не ожидаете), если вы просто индексируете весь поддокумент в отличие от определенного поля, а затем выполняете оператор сравнения (например, $gte) - если вы индексируете конкретное подполе, вы получаете менее гибкий, но потенциально более полезный индекс.

На самом деле все зависит от вашего варианта использования.

В любом случае, как только вы создали индекс, вы можете проверить, что создано с помощью:

> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

Как вы можете видеть из вывода, он создал новый ключ с именем data.name_1_data.age_1_data.job_1 (всегда создается индекс _id_).

Если вы хотите протестировать свой новый индекс, вы можете сделать:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

Главное, что вы можете видеть, что ваш новый индекс был использован ( BtreeCursor data.name_1_data.age_1_data.job_1 в поле курсора означает, что это так). Если вы видите "cursor" : "BasicCursor", то ваш индекс не использовался.

Для более подробной информации смотрите здесь.

Ответ 2

вы можете попробовать следующее:

db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})