我有产品目录,我想通过许多参数过滤它: 类别,价格,尺寸,颜色,用途等。
所以问题是关于索引。
我可以尝试在所有字段上使用复合索引,并按照索引它们的相同顺序查询它们。但是,如果我只需按尺寸和尺寸进行过滤,该怎么办?颜色,然后只有价格&重量?为每个可能的过滤查询创建复合索引将是过度的,因为可能有太多的参数。
所以经过一些搜索,我找到了interesting approach
建议使用“规范化属性”:
{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"]}
答案 0 :(得分:1)
在商店目录中(有效地)搜索确实是一项非常重要的任务。
是的,您可以创建一个额外的集合并存储所有值
{name: "language", value: "English", numValue: "13"}
不,您不需要每次都重新查询此集合。此处的数据大小可能很小,因此您可以在应用程序进程中缓存它。不要忘记提示:始终将属性设置为最低基数。
另一种方法是使用位掩码,但由于MongoDB的整数长度有限,因此无法获得无限数量的属性。