这里指的是this问题:
我在一个类似的网站上工作,使用mongodb作为我的主数据库。正如您可以想象的那样,每个用户对象都有许多需要可供搜索的字段,例如情绪、城市、年龄、性别、吸烟者、饮酒者等。
现在,除了每个集合不能超过64个索引的问题之外,将索引分配给我的所有字段是否明智?
可能还有另一种可行的方法:标签(参见this other问题)如果我在一个预先确定的标签数组上设置索引,然后对它们进行文本搜索,会不会更好?因为我只使用了一个索引。你认为如何?例如:
{
name: "john",
tags: ["happy", "new-york", "smoke0", "drink1"]
}发布于 2013-03-26 00:43:54
MongoDB doesn't (yet) support index intersection,所以规则是:每个查询一个索引。有些查询参数的选择性极低,最极端的例子是布尔型参数,对这些参数进行索引通常会减慢速度而不是加快速度。
作为一个简单的近似,您可以创建一个从选择性最高的字段开始的复合索引,例如{“城市”,“年龄”,“情绪”,... }。但是,您必须始终使用城市约束。如果您查询{age,mood},则不会使用上面的索引。
如果您可以使用索引将结果集缩小到一个合理的大小,那么该集中的扫描将不会占用大量的性能。更准确地说,如果你说limit(100)和MongoDB必须扫描200个项目才能填满这100个项目,这将不是关键。
危险在于在整个数据库中进行非常狭窄的搜索-如果你必须对整个数据集进行扫描才能找到唯一不快乐的、95岁以上的饮酒不吸烟的人,事情就会变得很糟糕。
如果您希望允许非常细粒度的搜索,则专用的搜索数据库(如SolR )可能是更好的选择。
编辑:tags的建议在我看来有点像使用crowbar --也许MongoDB常见问题解答中推荐的key/value multikey index是一个更干净的解决方案:
{ _id : ObjectId(...),
attrib : [
{ k: "mood", v: "happy" },
{ k: "city": v: "new york" },
{ k: "smoker": v: false },
{ k: "drinker": v: true }
]
}然而,YMMV和“干净”和“快速”通常不指向同一个方向,所以tags方法可能一点也不坏。
https://stackoverflow.com/questions/15619151
复制相似问题