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

Indexação do Mongo em arrays de objetos vs objetos


A consulta certamente será muito mais fácil no segundo caso, onde 'grupos' é uma matriz de subdocumentos, cada um com um 'id' e um 'nome'.

O Mongo não suporta consultas "curinga", portanto, se seus documentos foram estruturados da primeira maneira e você deseja encontrar um subdocumento com o valor "oi", mas não sabe que a chave é 152, não poderá faça isso. Com a segunda estrutura de documento, você pode facilmente consultar {"groups.name":"hi"}.

Para obter mais informações sobre como consultar objetos incorporados, consulte a documentação intitulada "Notação de ponto (alcançar objetos)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 As seções "Valor em uma matriz" e "Valor em um objeto incorporado" da documentação "Consultas avançadas" também são úteis:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Para um índice em {'groups.id':1}, uma entrada de índice será criada para cada chave "id" em cada array "groups" em cada documento. Com um índice em "grupos", apenas uma entrada de índice será criada por documento.

Se você tiver documentos do segundo tipo e um índice em grupos, suas consultas terão que corresponder a subdocumentos inteiros para usar o índice. Por exemplo, dado o documento:
{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }

A pergunta
db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }}) 

fará uso do índice, mas as consultas
db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})

ou
db.<collectionName>.find({"groups.name":"hi"})

não vou.

O(s) índice(s) que você cria deve(m) depender de quais consultas você realizará com mais frequência.

Você pode experimentar quais índices (se houver) suas consultas estão usando com o comando .explain(). http://www.mongodb.org/display/DOCS/Explain A primeira linha, "cursor", informará qual índice está sendo usado. "cursor" :"BasicCursor" indica que uma verificação de coleção completa está sendo executada.

Há mais informações sobre indexação na documentação:http://www.mongodb.org/display /DOCS/Indexes

A seção "Indexing Array Elements" dos links acima para o documento intitulado "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Esperamos que isso melhore sua compreensão de como consultar documentos incorporados e como os índices são usados. Por favor, deixe-nos saber se você tiver alguma dúvida de acompanhamento!