2番目のケースでは、クエリがはるかに簡単になります。この場合、「groups」はサブドキュメントの配列であり、それぞれに「id」と「name」があります。
Mongoは「ワイルドカード」クエリをサポートしていないため、ドキュメントが最初の方法で構造化されていて、値が「hi」のサブドキュメントを検索したいが、キーが152であることを知らなかった場合、次のことはできません。やれ。 2番目のドキュメント構造を使用すると、{"groups.name":"hi"}を簡単にクエリできます。
埋め込みオブジェクトのクエリの詳細については、「ドット表記(オブジェクトに到達)」というタイトルのドキュメントを参照してください http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
「AdvancedQueries」ドキュメントの「ValueinaArray」セクションと「ValueinaEmbeddedObject」セクションも役立ちます。
{'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/インデックス
上記の「配列要素のインデックス作成」セクションは、「マルチキー」というタイトルのドキュメントにリンクしています。 http: //www.mongodb.org/display/DOCS/Multikeys
うまくいけば、これにより、埋め込まれたドキュメントをクエリする方法と、インデックスがどのように使用されるかについての理解が深まります。フォローアップの質問がある場合はお知らせください!