0

例: Stores という db コレクションがあり、各ストア ドキュメントに販売するアイテムのリストがあり、ストアが一般的にアイテムを共有している場合、mongodb はどのようにインデックスを構築するのでしょうか? 可能なすべてのアイテムに btree インデックスを作成し、そのツリーの各リーフ (各アイテム) でそれを含むドキュメントを参照しますか?

背景: インデックスを使用して次のようなクエリを実行しようとしています:

db.store.find({merchandise:{$exists:true}}) // where 'merchandise' is a list
db.store.find()[merchandise].count()

「商品」の索引は役に立ちますか? そうでない場合、「商品」サイズに別のメタフィールドを作成し、それをインデックス化する唯一のオプションですか?

スキーマ:

{ _id: 123456,
  name: Macys
  merchandise: [ 248651234564, 54862101248, 12450184, 1256001456 ]
}
4

2 に答える 2

1

配列を含むフィールドにインデックスを付ける場合、MongoDB は配列内の各値を個別にmultikey index. 配列内に 4 つのドキュメントがある場合、それぞれがインデックスのキーとして機能し、前述のドキュメントをポイントします。

マルチキー インデックスを使用して、配列に埋め込まれたオブジェクト内のフィールドにインデックスを付けることができます。つまり、配列では、各ドキュメントの特定のフィールドにインデックスを付けることができます。例: stuffs.thing : 1.

マルチキー インデックスの詳細を読む

これらのインデックスが必要かどうかは、次の条件によって異なります。

  • その特定のフィールドに依存するクエリはいくつありますか?
  • その特定のフィールド (配列) にヒットする更新、挿入の数は?
  • その配列にはいくつのアイテムが含まれますか?
  • ...

インデックスも更新する必要があるため、書き込みが遅くなることに注意してください。パフォーマンスを測定するために、クエリの説明を検討します。

于 2013-09-03T21:09:00.050 に答える
1

ドキュメントのサンプルから、商品にインデックスを作成すると、それはマルチキー インデックスになり、そのインデックスはアレイのすべてのアイテムになります。ここのマルチキー インデックスのセクションを参照してください

商品がサブドキュメントの配列である場合、商品にインデックスを付けると、配列内のサブドキュメントのすべてのフィールドにインデックスが配置されます。インデックスを使用すると、db.store.find("merchandise":248651234564) のようなクエリを作成でき、商品 248651234564 を持つすべてのドキュメントが取得されます。

商品の個数を取得するには、db.store.find()[index].merchandise.length のように 1 つのドキュメントの商品フィールドのサイズしか取得できません。そのため、商品のサイズに基づいてクエリを実行する場合は、商品のサイズとインデックス作成に関する別のフィールドを作成することをお勧めします。

お役に立てれば

于 2013-09-03T21:02:15.013 に答える