Можете да направите едно от двете:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Това се обсъжда в документацията под индекси на вградени полета и индекси на поддокументи
Важната секция на секцията на поддокумента е „Когато извършвате съвпадения за равенство на поддокументи, редът на полето има значение и поддокументите трябва да съвпадат точно.“
Това означава, че двата индекса са еднакви за прости заявки.
Въпреки това, както показва примерът с поддокумента, можете да получите някои интересни резултати (които може да не очаквате), ако просто индексирате целия поддокумент, за разлика от конкретно поле и след това направите оператор за сравнение (като $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"
, тогава вашият индекс не е бил използван.
За по-подробна информация вижте тук.