Du kan göra antingen :
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Detta diskuteras i dokumentationen under index-på-inbäddade-fält och index på underdokument
Det viktiga avsnittet i underdokumentsektionen är 'När man utför jämställdhetsmatchningar på underdokument, måste fältordningsärenden och underdokumenten matcha exakt.'
Detta betyder att de två indexen är desamma för enkla frågor.
Men som exemplet med underdokument visar kan du få några intressanta resultat (som du kanske inte förväntar dig) om du bara indexerar hela underdokumentet i motsats till ett specifikt fält och sedan gör en jämförelseoperator (som $gte
) - om du indexerar ett specifikt underfält får du ett mindre flexibelt, men potentiellt mer användbart index.
Allt beror verkligen på ditt användningsfall.
Hur som helst, när du har skapat indexet kan du kontrollera vad som skapas 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 från utdata skapade den en ny nyckel som heter data.name_1_data.age_1_data.job_1
(den _id_
index skapas alltid).
Om du vill testa ditt nya index kan du göra:
> 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
Huvudsaken är att du kan se att ditt nya index användes (BtreeCursor data.name_1_data.age_1_data.job_1 i markörfältet är det som indikerar att så är fallet). Om du ser "cursor" : "BasicCursor"
, då användes inte ditt index.
För mer detaljerad information se här.