'groups' がサブドキュメントの配列で、それぞれが 'id' と 'name' を持つ 2 番目のケースでは、クエリは確かにはるかに簡単になります。
Mongo は「ワイルドカード」クエリをサポートしていないため、ドキュメントが最初の方法で構造化されていて、値が「hi」のサブドキュメントを検索したいが、キーが 152 であることを知らなかった場合、それはできません。やれ。2 番目のドキュメント構造を使用すると、{"groups.name":"hi"} を簡単にクエリできます。
埋め込みオブジェクトのクエリの詳細については、「ドット記法 (オブジェクトへの到達)」というタイトルのドキュメントを参照して
くださいhttp://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29「高度なクエリ」ドキュメントの「配列内」および「埋め込みオブジェクト内の値」セクションも役立ちます
。 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
{'groups.id':1} のインデックスの場合、すべてのドキュメントのすべての "groups" 配列のすべての "id" キーに対してインデックス エントリが作成されます。「グループ」のインデックスでは、ドキュメントごとに 1 つのインデックス エントリのみが作成されます。
2 番目のタイプのドキュメントとグループのインデックスがある場合、クエリはインデックスを利用するためにサブドキュメント全体に一致する必要があります。たとえば、次のドキュメントがあるとします。
{ "_id" : 1, "groups" : [ { "id" : 152, "name" : "hi" }, { "id" : 111, "name" : "group2" } ] }
クエリ
db.<collectionName>.find({groups:{ "id" : 152, "name" : "hi" }})
インデックスを利用しますが、クエリは
db.<collectionName>.find({"groups":{$elemMatch:{name:"hi"}}})
また
db.<collectionName>.find({"groups.name":"hi"})
しない。
作成するインデックスは、最も頻繁に実行するクエリによって異なります。
.explain() コマンドを使用して、クエリが使用しているインデックス (存在する場合) を試すことができます。 http://www.mongodb.org/display/DOCS/Explain 最初の行「cursor」は、どのインデックスが使用されているかを示します。"cursor" : "BasicCursor" は、フル コレクション スキャンが実行されていることを示します。
ドキュメントには、インデックス作成に関する詳細情報があります:
http://www.mongodb.org/display/DOCS/Indexes
上記の「Indexing Array Elements」セクションは、「Multikeys」というタイトルのドキュメントへのリンクです:
http://www.mongodb.org/display/DOCS/Multikeys
これにより、埋め込みドキュメントのクエリ方法とインデックスの使用方法についての理解が深まることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。