Możesz zrobić:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Jest to omówione w dokumentacji w części indexes-on-embedded-fields i indeksy w dokumentach podrzędnych
Ważną sekcją sekcji dokumentu podrzędnego jest „Podczas wykonywania dopasowań równości w dokumentach podrzędnych, kolejność pól ma znaczenie, a dokumenty podrzędne muszą dokładnie pasować”.
Oznacza to, że te 2 indeksy są takie same dla zapytań prostych.
Jednak, jak pokazuje przykład dokumentu podrzędnego, możesz uzyskać interesujące wyniki (których możesz się nie spodziewać), jeśli po prostu zindeksujesz cały dokument podrzędny w przeciwieństwie do określonego pola, a następnie wykonasz operator porównania (np. $gte
) - jeśli zindeksujesz określone podpole, otrzymasz mniej elastyczny, ale potencjalnie bardziej użyteczny indeks.
To naprawdę wszystko zależy od przypadku użycia.
W każdym razie po utworzeniu indeksu możesz sprawdzić, co zostało utworzone za pomocą :
> 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"
}
]
Jak widać z danych wyjściowych, utworzył nowy klucz o nazwie data.name_1_data.age_1_data.job_1
(_id_
indeks jest zawsze tworzony).
Jeśli chcesz przetestować swój nowy indeks, możesz:
> 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
Najważniejsze jest to, że możesz zobaczyć, że Twój nowy indeks został użyty (BtreeCursor data.name_1_data.age_1_data.job_1 w polu kursora wskazuje, że tak właśnie jest). Jeśli widzisz "cursor" : "BasicCursor"
, Twój indeks nie był używany.
Więcej szczegółowych informacji znajdziesz tutaj.