我对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
(文字搜索)name
和description
(文字搜索)category
(显示technology
类别中的所有产品)options->material
(显示所有由wood
制作的产品)category
和options->material
(显示technology
类别中由wood
组成的所有产品)我应该创建多少个索引?每个领域一个?每个字段一个,每个查询组合一个?
答案 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"]
}
哪个更简单,没有多余的字段描述,并且使用了现有的唯一索引作为电话名称。