Zapytania będą z pewnością dużo prostsze w drugim przypadku, gdzie 'groups' to tablica dokumentów podrzędnych, każdy z 'id' i 'name'.
Mongo nie obsługuje zapytań "wildcard", więc jeśli twoje dokumenty były ustrukturyzowane w pierwszej kolejności i chciałbyś znaleźć poddokument o wartości "hi", ale nie wiedziałeś, że klucz to 152, nie będziesz w stanie Zrób to. Dzięki drugiej strukturze dokumentu możesz łatwo zapytać o {"groups.name":"hi"}.
Więcej informacji na temat zapytań dotyczących osadzonych obiektów można znaleźć w dokumentacji zatytułowanej „Notacja kropkowa (dot. obiektów)” http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29 Przydatne są również sekcje „Wartość w tablicy” i „Wartość w obiekcie osadzonym” w dokumentacji „Zaawansowane zapytania”:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
W przypadku indeksu {'groups.id':1} wpis indeksu zostanie utworzony dla każdego klucza „id” w każdej tablicy „groups” w każdym dokumencie. W przypadku indeksu „grupy” w jednym dokumencie zostanie utworzony tylko jeden wpis indeksu.
Jeśli masz dokumenty drugiego typu i indeks grup, twoje zapytania będą musiały pasować do całych poddokumentów, aby móc skorzystać z indeksu. Na przykład, biorąc pod uwagę dokument:
{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }
Zapytanie
db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }})
skorzysta z indeksu, ale zapytania
db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})
lub
db.<collectionName>.find({"groups.name":"hi"})
nie będzie.
Tworzone indeksy powinny zależeć od najczęściej wykonywanych zapytań.
Za pomocą polecenia .explain() możesz poeksperymentować, z jakimi (jeśli w ogóle) indeksami są używane Twoje zapytania. http://www.mongodb.org/display/DOCS/Explain Pierwsza linia, "kursor", powie Ci, który indeks jest używany. "cursor" :"BasicCursor" wskazuje, że wykonywane jest pełne skanowanie kolekcji.
Więcej informacji na temat indeksowania można znaleźć w dokumentacji:http://www.mongodb.org/display /DOCS/Indeksy
Sekcja „Indexing Array Elements” w powyższych linkach do dokumentu zatytułowanego „Multikeys”:http://www.mongodb.org/display/DOCS/Multikeys
Mamy nadzieję, że poprawi to twoje zrozumienie, jak wykonywać zapytania dotyczące osadzonych dokumentów i jak używane są indeksy. Daj nam znać, jeśli masz dodatkowe pytania!