web-dev-qa-db-ja.com

オブジェクト配列とオブジェクトのMongoインデックス作成

かなりの数のフィールドを処理する連絡先データベースを実装しています。それらのほとんどは事前定義されており、バインドされていると見なすことができますが、そうでないものもいくつかあります。これらのフィールドの1つを「グループ」と呼びます。現在実装している方法は次のとおりです(各ドキュメント/連絡先には「グループ」フィールドがあります)。

_'groups' : {
   152 : 'hi',
   111 : 'group2'
}
_

しかし、いくつか読んだ後、私はそれをすべきであるように思われるでしょう:

_'groups' : [
   { 'id' : 152, 'name' : 'hi' },
   { 'id' : 111, 'name' : 'group2' }
   ...
]
_

次に、インデックスdb.contact.ensureIndex({'groups.id':1});を適用します

私の質問は機能性に関するものです。 2つの構造の違いは何ですか?インデックスは実際にどのように作成されますか(各ドキュメント/連絡先内で単にインデックスを作成するのですか、それともすべてのドキュメント/連絡先のすべてのグループを含む本格的なインデックスを作成するのですか?)。

私はこれが構造的に最善の方法であると思い込んでいますが、間違っている場合はお知らせください。

29
Ghjnut

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」セクションも役立ちます。 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

上記の「配列要素のインデックス作成」セクションは、「マルチキー」というタイトルのドキュメントにリンクしています。 http://www.mongodb.org/display/DOCS/Multikeys

これにより、埋め込みドキュメントでクエリを実行する方法と、インデックスがどのように使用されるかについての理解が深まると思います。フォローアップの質問があればお知らせください!

48
Marc