MongoDB需要多少索引

MongoDB需要多少索引,mongodb,indexing,Mongodb,Indexing,我对MongoDB中索引的使用有一些疑问 假设我有一组产品文档,例如: { "name": "Sony phone", "description": "Android phone made by Sony...", "category": ["technology", "phones"], "stock": 70, "price": 100, "options": { "colors": ["red", "black", "blue

我对MongoDB中索引的使用有一些疑问

假设我有一组产品文档,例如:

{
    "name": "Sony phone",
    "description": "Android phone made by Sony...",
    "category": ["technology", "phones"],
    "stock": 70,
    "price": 100,
    "options": {
        "colors": ["red", "black", "blue"],
        "material": ["plastic", "wood", "aluminium"]
    }
}
现在,假设有时我会查询产品集合:

仅按名称文本搜索 按名称和说明文本搜索 按类别显示技术类别中的所有产品 按选项->材质显示所有木制产品 按类别和选项->材质显示技术类别中所有由木材制成的产品
我应该创建多少个索引?每个字段一个?每个字段一个+每个查询组合一个?

当查询字段包含在索引中时,MongoDB可以使用索引。此外,尽管可以为多个字段编制索引,但每个集合只能有一个文本索引

因此,根据您的示例,您需要两个索引:

db.collection.ensureIndex({
  name:"text",
  description:"text"
})
有了它,你就可以像搜索索尼一样搜索了

db.collection.find({ $text: { $search: "Sony"} })
它将返回索尼公司以名称或描述出现的所有文档

接下来,您需要在类别和选项上建立索引。材质:

db.collection.ensureIndex({
  category:1,
  "options.material":1
})
在shell上执行查询时,可以通过在查询中添加.explain来检查是否使用了索引

注意:我看不出有选项子文档的意义。相同的信息包含在

{
  _id: "Sony Experia Z3",
  description:"foo bar baz",
  material:["plastic","metal"],
  colors:["black","blue"]
}

它更简单,没有多余的字段描述,并且使用了一个已经存在的唯一的电话号码索引。

只是为了清楚起见。ensureIndex{a:1,b:1}将允许我同时按a、b或a和b进行搜索,对吗?关于每个集合的1个文本索引,您知道我是否可以使用任何变通方法或技巧/技巧来改善这种情况吗?@alexandernst我向您展示了变通方法。只需为文本索引中的多个字段编制索引。对于复合指数:是的,没错。调查,解释;不,我的意思是,我能不能让它只在名称和描述中搜索,但不能同时在名称和描述中搜索?@alexandernst在这种情况下,在名称和描述上创建一个附加索引,并分别使用db.collection.find{name:/Sony/I}或db.collection.find{description:/Sony/I}。但这将进行正则表达式搜索,我要求的是文本搜索。我不能对每个字段分别进行真正的文本搜索吗?