MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Índice de subdocumento no mongo


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.