Performance MongoDB多参数过滤(是否复合索引)
我有产品目录,我想通过许多参数对其进行过滤: 类别、价格、尺寸、颜色、重量等 所以问题是关于索引 我可以尝试在所有字段上使用复合索引,并按索引顺序查询它们。但是,如果我只需要按大小和颜色过滤,然后只需按价格和重量过滤,该怎么办?为每个可能的筛选查询创建复合索引将过于繁琐,因为可能有太多的参数 所以经过一番搜索,我找到了一个 建议使用“规范化属性”: 现在,mongo记录将如下所示:Performance MongoDB多参数过滤(是否复合索引),performance,mongodb,indexing,filtering,compound-index,Performance,Mongodb,Indexing,Filtering,Compound Index,我有产品目录,我想通过许多参数对其进行过滤: 类别、价格、尺寸、颜色、重量等 所以问题是关于索引 我可以尝试在所有字段上使用复合索引,并按索引顺序查询它们。但是,如果我只需要按大小和颜色过滤,然后只需按价格和重量过滤,该怎么办?为每个可能的筛选查询创建复合索引将过于繁琐,因为可能有太多的参数 所以经过一番搜索,我找到了一个 建议使用“规范化属性”: 现在,mongo记录将如下所示: {_id: ..., attributes: [10,25,30]} 然后我应该按属性进行索引,然后我可以通过以
{_id: ..., attributes: [10,25,30]}
然后我应该按属性进行索引,然后我可以通过以下方式进行查询:
db.items.find(attributes: {$all: [10,25,30]})
忠告包括:
- 较小的索引
- 更快的查找
- 任意数量的参数
- 易生长
{_id: ..., attributes: ["language.English", "color.red"]}
在商店目录中(高效地)搜索确实是一项非常重要的任务
是的,您可以创建一个附加集合并将所有值存储在该集合中
{name: "language", value: "English", numValue: "13"}
不,您不需要每次都重新查询此集合。这里的数据大小可能很小,所以您可以在应用程序进程中缓存它。不要忘记提示:始终将基数最低的属性放在第一位
另一种方法是使用位屏蔽,但由于MongoDB的整数长度有限,因此无法获得无限数量的属性。Hi Sergio!谢谢你的回答。我正在考虑另一种方法——如果我使用串联字符串而不是数字,会怎么样?{attributes:[“language.English”,“color.red”]}您将拥有更大的索引。我不会那么做的。
{name: "language", value: "English", numValue: "13"}