【MongoDB】索引之单字段索引(Single Field Indexes)

本章内容:

  • 在单个字段上创建升序索引
  • 在嵌入式字段上创建索引
  • 在嵌入式文档上创建索引
  • 其他注意事项

MongoDB对文档集合中任意字段上的索引提供全方位支持。默认情况下,所有集合在_id字段上都有一个索引,应用程序和用户可以添加其他索引来支持重要的查询和操作。

本文讲述单个字段上的升序/降序索引。

”score''字段上的索引图(升序)
”score''字段上的索引图(升序)

 

一、在单字段上创建升序索引

考虑一个名为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来指定索引。这对结果索引没有任何影响。

上篇:索引概述(二)

下篇:复合索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值