索引的重要性,应该无需多说了,它可以优化我们的查询,而且在某些特定类型的查询中,索引几乎是必不可少的。这篇文章主要介绍了MongoDB中的几种常见的索引以及在使用时候的一些注意事项。这几种索引基本上涵盖了我们在平时开发的时候会遇到的大部分情况,但是,仍然需要注意的是,这篇文章没有涉及一些特殊的索引,比如TTL索引、全文本索引和地理空间索引,想要了解这几个索引的同学在这里可能得不到想要的答案。
单一索引
单一索引应该是MongoDB里最简单和最容易理解的索引,但由于MongoDB是一个非关系型数据库,它的索引结构跟常见的关系型数据库(例如MySQL)又有所不同。
1、在单一字段上建立索引
假设我们有一个名为records 的 collection ,其中存储的文档格式如下:
{
"_id": ObjectId("570c04a4ad233577f97dc459"),
"score": 1034,
"location": { state: "NY", city: "New York" }
}
我们希望在score
字段上建立升序
索引,可以执行如下语句
db.records.createIndex({
score:1})
其中1
代表索引按升序排列各项,-1
代表按降序排列。这个索引支持在score
字段进行查询,例如下面的查询语句:
db.records.find({
score: 2})
db.records.find({
score: {$gt: 10}})
2、在内嵌文档字段上建立索引
同样,我们也可以在一个嵌入文档的字段上建立索引,注意这里是针对嵌入文档的某一个字段建立索引。还是考虑上面的文档,我们希望在location的state字段建立索引,可以如下操作
db.records.createIndex({
"location.state": 1})
也就是,内嵌文档与字段之间用.
分割就可以了。这个索引支持如下的查询:
db.records.find({
"location.state": "CA"})
db.records.find({
"location.city": "Albany", "location.state": "NY"})
注意这里的第二个查询语句,location.state
并不是第一位的查询条件,因为我们已经在location.state
上加了索引,mongo会优先使用索引查询,所以这条语句也是有效的。
3、在内嵌文档上建立索引
在上面的例子中,location
字段是一个内嵌文档,我们可以针对整个location
字段来建立索引,这里需要注意与在内嵌文档字段上建立索引的区别
db.records.createIndex({
location: 1})
考虑下面的查询语句
db.records.find({
location: {city: "New York", sta