我有产品目录,我想按许多参数过滤它:类别、价格、尺寸、颜色、重量等。
所以问题是关于索引。
我可以尝试对所有字段使用复合索引,并以与索引它们相同的顺序查询它们。但是,如果我只需要按尺寸和颜色过滤,然后只按价格和重量过滤呢?为每个可能的过滤查询创建复合索引将是多余的,因为可能有太多参数。
所以经过一番搜索,我发现了一个有趣的方法
建议使用“规范化属性”:
{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"]}