Você pode fazer:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Isso é discutido na documentação em índices em campos incorporados e índices em subdocumentos
A seção importante da seção de subdocumentos é 'Ao realizar correspondências de igualdade em subdocumentos, a ordem dos campos é importante e os subdocumentos devem corresponder exatamente.'
Isso significa que os 2 índices são os mesmos para consultas simples.
No entanto, como mostra o exemplo do subdocumento, você pode obter alguns resultados interessantes (que você pode não esperar) se você indexar todo o subdocumento em oposição a um campo específico e, em seguida, fizer um operador de comparação (como
$gte
) - se você indexar um subcampo específico, obterá um índice menos flexível, mas potencialmente mais útil. Realmente tudo depende do seu caso de uso.
De qualquer forma, depois de criar o índice, você pode verificar o que foi criado com:
> 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"
}
]
Como você pode ver na saída, foi criada uma nova chave chamada
data.name_1_data.age_1_data.job_1
(o _id_
índice é sempre criado). Se você quiser testar seu novo índice, poderá fazer:
> 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
O principal é que você pode ver que seu novo índice foi usado (BtreeCursor data.name_1_data.age_1_data.job_1 no campo do cursor é o que indica que este é o caso). Se você vir
"cursor" : "BasicCursor"
, seu índice não foi usado. Para informações mais detalhadas veja aqui.