本章内容:
- 在单个字段上创建升序索引
- 在嵌入式字段上创建索引
- 在嵌入式文档上创建索引
- 其他注意事项
MongoDB对文档集合中任意字段上的索引提供全方位支持。默认情况下,所有集合在_id字段上都有一个索引,应用程序和用户可以添加其他索引来支持重要的查询和操作。
本文讲述单个字段上的升序/降序索引。
一、在单字段上创建升序索引
考虑一个名为records的集合,其中包含类似于以下内容的文档:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
下面的操作是在records集合的score字段上创建一个升序索引:
db.records.createIndex( { score: 1 } )
索引字段的值描述了该字段的索引类型。例如,值1指定一个索引,该索引按升序对项目进行排序。值-1指定一个索引,该索引按降序对文档的记录条目进行排序。有关其他索引类型,请参见索引类型。
创建的索引将支持对score字段筛选的查询,例如:
db.records.find( { score: 2 } )
db.records.find( { score: { $gt: 10 } } )
二、在嵌入式字段上创建索引
可以在嵌入式文档的字段上创建索引,就像可以在文档的顶级字段上建立索引一样。嵌入字段上的索引与嵌入文档上的索引不同,后者包含完整的嵌入式文档的全部字段内容,最多不超过最大索引大小。相反,嵌入式字段上的索引使用“点符号”来对嵌入式文档进行内部检查。
考虑一个名为records的集合,其中包含类似于以下样本文档的文档:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
以下操作在location.state字段上创建索引:
db.records.createIndex( { "location.state": 1 } )
创建的索引将支持在字段location.state上的查询,例如:
db.records.find( { "location.state": "CA" } )
db.records.find( { "location.city": "Albany", "location.state": "NY" } )
三、在嵌入式文档上创建索引
除了在嵌入式文档字段上创建所以之外,还可以在整个嵌入式文档上创建索引。
考虑一个名为records的集合,其中包含类似于以下示例文本的文档:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
location 字段是一个嵌入式文档,其中包含嵌入式字段city 和 state。以下命令将在整个位置字段上创建一个索引:
db.records.createIndex({location:1})
下面的查询可以使用location字段上的索引:
db.records.find( { location: { city: "New York", state: "NY" } } )
注意
尽管查询可以使用该索引,但是结果集不包括上面的示例文档。当对嵌入式文档执行相等匹配时,字段顺序很重要,并且嵌入式文档必须完全匹配。有关查询嵌入式文档的更多信息,请参见查询嵌入式文档。
四、其他注意事项
应用程序在建立索引期间可能会遇到性能下降的情况,包括限制了对集合的读/写访问。有关索引构建过程的更多信息,请参见填充集合上的索引构建,包括Replicate环境中的索引构建。
有的驱动程序可能使用 NumberLong(1)而非1来指定索引。这对结果索引没有任何影响。
上篇:索引概述(二)
下篇:复合索引