製品のカタログがあり、カテゴリ、価格、サイズ、色、重量などの多くのパラメータでフィルタリングしたい.
質問は索引付けについてです。
すべてのフィールドで複合インデックスを使用して、インデックスを作成したのと同じ順序でクエリを実行できます。しかし、サイズと色だけでフィルタリングし、次に価格と重量だけでフィルタリングする必要がある場合はどうすればよいでしょうか? パラメータが多すぎる可能性があるため、考えられるフィルタリングクエリごとに複合インデックスを作成するのはやり過ぎです。
それで、いくつかの検索の後、私は興味深いアプローチを見つけました
「正規化された属性」を使用することが提案されています。
{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"]}