多くのパラメーター(複合インデックスかどうか)によるMongoDBフィルタリング
-
29-10-2019 - |
質問
製品のカタログがあり、多くのパラメーターでフィルター処理したい: カテゴリ、価格、サイズ、色、幅など。
つまり、問題はインデックス作成についてです。
すべてのフィールドで複合インデックスを使用して、インデックスを作成したのと同じ順序でクエリを実行できます。しかし、サイズと色だけでフィルタリングし、次に価格と重量だけでフィルタリングする必要がある場合はどうなりますか?パラメータが多すぎる可能性があるため、可能なフィルタリングクエリごとに複合インデックスを作成するのはやり過ぎです。
検索したところ、
「正規化された属性」を使用することをお勧めします: ジェネラコディセタグプレ
これで、mongoレコードは次のようになります: ジェネラコディセタグプレ
次に、属性でインデックスを作成する必要があります。その後、次のようにクエリを実行できます。 ジェネラコディセタグプレ
利点は次のとおりです:
- 小さいインデックス
- より高速なルックアップ
- 任意の数のパラメータ
- 成長しやすい
私が理解していなかったのは、各属性のこれらの数値を取得するにはどうすればよいですか?それらはどういうわけか(md5のように)計算されていますか?または、別のコレクションを作成して、各Key-Value-Numberをそこに保存する必要がありますか?そして、最初にそこから番号を取得します-「アイテム」コレクションをフィルタリングする必要があるたびに?
そして、このアプローチについてどう思いますか?
更新: 数字の代わりに連結された文字列を使用するとどうなりますか? ジェネラコディセタグプレ
解決
ストアカタログを(効率的に)検索することは、確かに簡単な作業ではありません。
はい、追加のコレクションを作成して、そこにすべての値を保存できます ジェネラコディセタグプレ
いいえ、このコレクションを毎回再クエリする必要はありません。ここでのデータサイズはおそらく小さいので、アプリケーションプロセスでキャッシュできます。ヒントを忘れないでください。常にカーディナリティが最も低い属性を最初に配置してください。
別のアプローチはビットマスキングを使用することですが、MongoDBの整数長は制限されているため、無制限の数の属性を取得することはできません。