MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Indicizzazione Mongo su array di oggetti vs oggetti

L'interrogazione sarà sicuramente molto più semplice nel secondo caso, dove "gruppi" è un array di documenti secondari, ciascuno con un "id" e un "nome".

Mongo non supporta le query "caratteri jolly", quindi se i tuoi documenti fossero strutturati nel primo modo e volessi trovare un documento secondario con il valore "ciao", ma non sapessi che la chiave era 152, non saresti in grado di fallo. Con la seconda struttura del documento, puoi facilmente interrogare {"groups.name":"hi"}.

Per ulteriori informazioni sull'esecuzione di query sugli oggetti incorporati, consultare la documentazione intitolata "Dot Notation (Reaching into Objects)" http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+in+Objects%29 Sono utili anche le sezioni "Valore in un array" e "Valore in un oggetto incorporato" della documentazione "Query avanzate":http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

Per un indice su {'groups.id':1}, verrà creata una voce di indice per ogni chiave "id" in ogni array "groups" in ogni documento. Con un indice su "gruppi", verrà creata una sola voce di indice per documento.

Se si dispone di documenti del secondo tipo e di un indice sui gruppi, le query dovranno corrispondere a interi documenti secondari per utilizzare l'indice. Ad esempio, dato il documento:

{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }

La domanda

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

utilizzerà l'indice, ma le query

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

o

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

non lo farà.

Gli indici che crei dovrebbero dipendere dalle query che eseguirai più comunemente.

Puoi sperimentare quali indici (se presenti) stanno utilizzando le tue query con il comando .explain(). http://www.mongodb.org/display/DOCS/Explain La prima riga, "cursore", ti dirà quale indice viene utilizzato. "cursor" :"BasicCursor" indica che è in corso un'analisi completa della raccolta.

Ulteriori informazioni sull'indicizzazione sono disponibili nella documentazione:http://www.mongodb.org/display /DOCS/Indici

La sezione "Indicizzazione degli elementi dell'array" di cui sopra si collega al documento intitolato "Multikeys":http://www.mongodb.org/display/DOCS/Multikeys

Si spera che questo migliorerà la tua comprensione di come eseguire query sui documenti incorporati e di come vengono utilizzati gli indici. Fateci sapere se avete domande di follow-up!