MongoDB通过许多参数过滤(复合索引与否)
Posted
技术标签:
【中文标题】MongoDB通过许多参数过滤(复合索引与否)【英文标题】:MongoDB filtering by many parameters (compound index or not) 【发布时间】:2012-03-12 12:22:54 【问题描述】:我有产品目录,我想通过许多参数对其进行过滤: 类别、价格、尺寸、颜色、重量等。
所以问题是关于索引的。
我可以尝试对所有字段使用复合索引,并按照我索引它们的顺序查询它们。但是,如果我只需要按尺寸和颜色过滤,然后只按价格和重量过滤呢?为每个可能的过滤查询创建复合索引将是多余的,因为可能有太多参数。
所以经过一番搜索,我找到了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"]
【问题讨论】:
【参考方案1】:在商店目录中(有效地)搜索确实是一项不平凡的任务。
是的,您可以创建一个额外的集合并在其中存储所有值
name: "language", value: "English", numValue: "13"
不,您不需要每次都重新查询此集合。这里的数据量可能会很小,因此您可以将其缓存在应用程序进程中。不要忘记提示:始终将具有最低基数的属性放在首位。
另一种方法是使用位掩码,但由于 MongoDB 的整数长度有限,您无法获得无限数量的属性。
【讨论】:
嗨塞尔吉奥!感谢另一个很好的答案。我正在考虑另一种方法 - 如果我将使用连接字符串而不是数字怎么办? 属性:["language.English", "color.red"] 您将拥有更大的索引。我不会那样做。以上是关于MongoDB通过许多参数过滤(复合索引与否)的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB——索引类型之复合索引(Compound Index)