Performance MongoDB多参数过滤(是否复合索引)

Performance MongoDB多参数过滤(是否复合索引),performance,mongodb,indexing,filtering,compound-index,Performance,Mongodb,Indexing,Filtering,Compound Index,我有产品目录,我想通过许多参数对其进行过滤: 类别、价格、尺寸、颜色、重量等 所以问题是关于索引 我可以尝试在所有字段上使用复合索引,并按索引顺序查询它们。但是,如果我只需要按大小和颜色过滤,然后只需按价格和重量过滤,该怎么办?为每个可能的筛选查询创建复合索引将过于繁琐,因为可能有太多的参数 所以经过一番搜索,我找到了一个 建议使用“规范化属性”: 现在,mongo记录将如下所示: {_id: ..., attributes: [10,25,30]} 然后我应该按属性进行索引,然后我可以通过以

我有产品目录,我想通过许多参数对其进行过滤: 类别、价格、尺寸、颜色、重量等

所以问题是关于索引

我可以尝试在所有字段上使用复合索引,并按索引顺序查询它们。但是,如果我只需要按大小和颜色过滤,然后只需按价格和重量过滤,该怎么办?为每个可能的筛选查询创建复合索引将过于繁琐,因为可能有太多的参数

所以经过一番搜索,我找到了一个

建议使用“规范化属性”:

现在,mongo记录将如下所示:

{_id: ..., attributes: [10,25,30]}
然后我应该按属性进行索引,然后我可以通过以下方式进行查询:

db.items.find(attributes: {$all: [10,25,30]})
忠告包括:

  • 较小的索引
  • 更快的查找
  • 任意数量的参数
  • 易生长
我不明白的是,如何获得每个属性的数字?它们是否经过计算(如md5)?或者我应该创建一个不同的集合并将每个键值编号存储在那里?每次我需要过滤“项目”集合时,都要先从那里获取数字

你认为这种方法怎么样

更新: 如果我将使用串联字符串而不是数字呢

{_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"}