2

製品のカタログがあり、カテゴリ、価格、サイズ、色、重量などの多くのパラメータでフィルタリングしたい.

質問は索引付けについてです。

すべてのフィールドで複合インデックスを使用して、インデックスを作成したのと同じ順序でクエリを実行できます。しかし、サイズと色だけでフィルタリングし、次に価格と重量だけでフィルタリングする必要がある場合はどうすればよいでしょうか? パラメータが多すぎる可能性があるため、考えられるフィルタリングクエリごとに複合インデックスを作成するのはやり過ぎです。

それで、いくつかの検索の後、私は興味深いアプローチを見つけました

「正規化された属性」を使用することが提案されています。

{color: "red"} = 10
{weight: 125} = 25
{size: "M"} = 30

mongo レコードは次のようになります。

{_id: ..., attributes: [10,25,30]}

次に、属性でインデックスを作成する必要があります。その後、次の方法でクエリを実行できます。

db.items.find(attributes: {$all: [10,25,30]})

利点は次のとおりです。

  • より小さいインデックス
  • 検索の高速化
  • 任意の数のパラメータ
  • 成長しやすい

私が理解していなかったのは、各属性の数値を取得する方法です。それらは何らかの形で計算されていますか(md5のように)?または、別のコレクションを作成して、そこに各キー値番号を保存する必要がありますか? 「アイテム」コレクションをフィルタリングする必要があるたびに、最初にそこから数字を取得しますか?

そして、このアプローチについてどう思いますか?

更新: 数値の代わりに連結文字列を使用するとどうなりますか?

{_id: ..., attributes: ["language.English", "color.red"]}
4

1 に答える 1

1

ストア カタログを (効率的に) 検索することは、実に簡単な作業ではありません。

はい、追加のコレクションを作成し、そこにすべての値を保存できます

{name: "language", value: "English", numValue: "13"}

いいえ、毎回このコレクションを再クエリする必要はありません。ここでのデータ サイズは小さい可能性が高いため、アプリケーション プロセスでキャッシュできます。ヒントを忘れないでください。カーディナリティが最も低い属性を常に最初に配置してください。

もう 1 つのアプローチはビット マスキングを使用することですが、MongoDB は整数の長さに制限があるため、無制限の数の属性を取得することはできません。

于 2012-02-22T06:59:21.653 に答える