Du kan gøre enten :
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Dette er diskuteret i dokumentationen under indekser-på-indlejrede-felter og indekser på underdokumenter
Den vigtige sektion af underdokumentsektionen er 'Når der udføres lighedsmatches på underdokumenter, har feltrækkefølgen betydning, og underdokumenterne skal matche nøjagtigt.'
Det betyder, at de 2 indekser er de samme for simple forespørgsler.
Men som eksemplet med underdokument viser, kan du få nogle interessante resultater (som du måske ikke forventer), hvis du bare indekserer hele underdokumentet i modsætning til et specifikt felt og derefter laver en sammenligningsoperator (som $gte
) - hvis du indekserer et specifikt underfelt, får du et mindre fleksibelt, men potentielt mere nyttigt indeks.
Det hele afhænger virkelig af din use case.
Uanset hvad, når du har oprettet indekset, kan du kontrollere, hvad der er oprettet med :
> 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"
}
]
Som du kan se fra outputtet, oprettede den en ny nøgle kaldet data.name_1_data.age_1_data.job_1
(_id_
indeks oprettes altid).
Hvis du vil teste dit nye indeks, kan du gøre:
> 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
Det vigtigste er, at du kan se, at dit nye indeks blev brugt (BtreeCursor data.name_1_data.age_1_data.job_1 i markørfeltet er det, der indikerer, at dette er tilfældet). Hvis du ser "cursor" : "BasicCursor"
, så blev dit indeks ikke brugt.
For mere detaljeret information se her.