33

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

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

しかし、いくつか読んだ後、私はそれをやるべきだと思われます:

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

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

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

私はこれが構造的に最善の方法であるという仮定の下で行っていますが、間違っている場合はお知らせください.

4

1 に答える 1

55

'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

これにより、埋め込みドキュメントのクエリ方法とインデックスの使用方法についての理解が深まることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-03-06T23:41:39.817 に答える