MongoDB需要多少个索引

时间:2015-04-15 12:08:18

标签: mongodb indexing

我对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"]
    }
}

现在,让我们说有时候我会查询产品系列:

  • 仅限于name(文字搜索)
  • namedescription(文字搜索)
  • category(显示technology类别中的所有产品)
  • options->material(显示所有由wood制作的产品)
  • categoryoptions->material(显示technology类别中由wood组成的所有产品)

我应该创建多少个索引?每个领域一个?每个字段一个,每个查询组合一个?

1 个答案:

答案 0 :(得分:1)

当索引中查询的字段包含时,MongoDB可以使用索引。此外,每个集合只能有文本索引(尽管可以索引多个字段)。

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

db.collection.ensureIndex({
  name:"text",
  description:"text"
})

有了这个,你就会搜索"索尼"像

db.collection.find({ $text: { $search: "Sony"} })

哪个将返回索尼出现在" name"或"描述"。

接下来,你需要一个索引超过"类别"和" options.material":

db.collection.ensureIndex({
  category:1,
  "options.material":1
})

在shell上进行查询时,您可以通过在查询中附加.explain()来检查索引的使用情况。

注意:我没有看到有选项子文档的意义。

中包含相同的信息
{
  _id: "Sony Experia Z3",
  description:"foo bar baz",
  material:["plastic","metal"],
  colors:["black","blue"]
}

哪个更简单,没有多余的字段描述,并且使用了现有的唯一索引作为电话名称。