Puoi fare uno dei due:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Questo è discusso nella documentazione in indici su campi incorporati e indici su documenti secondari
La sezione importante della sezione del sottodocumento è "Quando si eseguono corrispondenze di uguaglianza sui documenti secondari, le questioni relative all'ordine dei campi e i documenti secondari devono corrispondere esattamente".
Ciò significa che i 2 indici sono gli stessi per le query semplici.
Tuttavia, come mostra l'esempio del sottodocumento, puoi ottenere alcuni risultati interessanti (che potresti non aspettarti) se indicizzi l'intero sottodocumento anziché un campo specifico e quindi esegui un operatore di confronto (come $gte
) - se indicizzi un sottocampo specifico ottieni un indice meno flessibile, ma potenzialmente più utile.
Dipende davvero tutto dal tuo caso d'uso.
Ad ogni modo, una volta creato l'indice puoi controllare cosa è stato creato con :
> 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"
}
]
Come puoi vedere dall'output ha creato una nuova chiave chiamata data.name_1_data.age_1_data.job_1
(il _id_
l'indice viene sempre creato).
Se vuoi testare il tuo nuovo indice, puoi farlo:
> 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
La cosa principale è che puoi vedere che il tuo nuovo indice è stato utilizzato (BtreeCursor data.name_1_data.age_1_data.job_1 nel campo del cursore è ciò che indica che questo è il caso). Se vedi "cursor" : "BasicCursor"
, il tuo indice non è stato utilizzato.
Per informazioni più dettagliate guarda qui.