Im zweiten Fall wird die Abfrage sicherlich viel einfacher sein, wo "Gruppen" ein Array von Unterdokumenten ist, jedes mit einer "ID" und einem "Namen".
Mongo unterstützt keine „Platzhalter“-Abfragen. Wenn Ihre Dokumente also auf die erste Art strukturiert wären und Sie ein Unterdokument mit dem Wert „hi“ finden wollten, aber nicht wüssten, dass der Schlüssel 152 lautet, wäre dies nicht möglich Tu es. Mit der zweiten Dokumentstruktur können Sie ganz einfach nach {"groups.name":"hi"} suchen.
Weitere Informationen zum Abfragen eingebetteter Objekte finden Sie in der Dokumentation mit dem Titel „Dot Notation (Reaching into Objects)“ http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+into+Objects%29 Die Abschnitte „Wert in einem Array“ und „Wert in einem eingebetteten Objekt“ der Dokumentation „Erweiterte Abfragen“ sind ebenfalls hilfreich:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
Für einen Index auf {'groups.id':1} wird ein Indexeintrag für jeden "id"-Schlüssel in jedem "groups"-Array in jedem Dokument erstellt. Bei einem Index auf „Gruppen“ wird nur ein Indexeintrag pro Dokument erstellt.
Wenn Sie Dokumente des zweiten Typs und einen Index für Gruppen haben, müssen Ihre Abfragen mit ganzen Unterdokumenten übereinstimmen, um den Index verwenden zu können. Zum Beispiel angesichts des Dokuments:
{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }
Die Abfrage
db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }})
verwendet den Index, aber die Abfragen
db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})
oder
db.<collectionName>.find({"groups.name":"hi"})
wird nicht.
Die Indizes, die Sie erstellen, sollten davon abhängen, welche Abfragen Sie am häufigsten ausführen werden.
Sie können mit dem Befehl .explain() experimentieren, welche Indizes (falls vorhanden) Ihre Abfragen verwenden. http://www.mongodb.org/display/DOCS/Explain Die erste Zeile, "cursor", sagt Ihnen, welcher Index verwendet wird. „cursor“ :„BasicCursor“ gibt an, dass ein vollständiger Erfassungsscan durchgeführt wird.
Weitere Informationen zur Indizierung finden Sie in der Dokumentation:http://www.mongodb.org/display /DOCS/Indizes
Der Abschnitt „Array-Elemente indizieren“ der obigen Links führt zu dem Dokument mit dem Titel „Multikeys“:http://www.mongodb.org/display/DOCS/Multikeys
Hoffentlich verbessert dies Ihr Verständnis dafür, wie Sie eingebettete Dokumente abfragen und wie Indizes verwendet werden. Bitte teilen Sie uns mit, wenn Sie weitere Fragen haben!