单键索引¶
MongoDB完整支持对 集合 中 文档 的任一键建立索引。每个集合默认都有一个 _id键 索引,而且应用和用户可以另外添加索引来支持重要的查询和操作。
MongoDB支持的索引可以包含单个键 或者 多个键,这取决于该索引想支持的操作。本文档描述的是只包含一个键的索引。以下是一个单键索引的示例。
例子¶
假设在 friends 集合有如下稳定:
{ "_id" : ObjectId(...),
"name" : "Alice"
"age" : 27
}
以下命令将会在 name 键上建立一个索引:
db.friends.ensureIndex( { "name" : 1 } )
案例¶
_id 键上的索引¶
当一个集合被创建时,MongoDB自动地创建 _id 索引,这个索引是升序的并且 唯一 ,包含 _id 键。 您不能移除这个 _id 索引。
可以把 _id 键看作是集合中的 主键 。每个文档 必须 有一个唯一的 _id 键。您也可以自己在 _id 键中存储任意唯一值。 _id 的默认值是一个 ObjectId ,它是在客户端插入文档时自动生成的。 ObjectId 是一个12-比特的唯一标识符,很适合作为 _id 键的值。
注解
在 分片集群 <sharded cluster>`中,如果您 *没有* 使用 ``_id` 键作为 分片键, 那么您的应用 必须 确保 _id 键值的唯一性以避免出现错误。 这个通常可以通过使用标准的自动生成的 ObjectId 来解决。
在版本2.2以前, 封顶集合(capped collection) 并没有 _id 键。在版本2.2及以后,封顶集合都会有一个 _id 键,在 本地 数据库`中的除外。点击阅读 :ref:`封顶集合的建议和限制 来了解更多。
内嵌文档的键的索引(Indexes on Embedded Fields)¶
您可以基于内嵌在子文档中的键建立索引,就像对文档中顶级键建立索引一样。 基于内嵌键的索引不同于 子文档索引, 后者会存储子文档的全部内容,直到最大极限 索引大小 。 与之相反,内嵌键的索引允许您使用 “点号,” 来深入索引子文档。
假设有一个名为 people 的集合,存储着如下的文档:
{"_id": ObjectId(...)
"name": "John Doe"
"address": {
"street": "Main",
"zipcode": "53511",
"state": "WI"
}
}
您可以基于 address.zipcode 键建立索引,使用如下命令:
db.people.ensureIndex( { "address.zipcode": 1 } )
子文档索引:¶
您可以基于子文档创建索引
比如, factories 集合中的文档包含了一个 metro 键,如下:
{
_id: ObjectId(...),
metro: {
city: "New York",
state: "NY"
},
name: "Giant Factory"
}
在这里 metro 键的值就是一个子文档,包含了内嵌的键: city 和 state。以下命令可以基于整个 metro 键建立索引:
db.factories.ensureIndex( { metro: 1 } )
如下查询可以利用到基于 metro 键的索引:
db.factories.find( { metro: { city: "New York", state: "NY" } } )
这条查询将会返回上文所提到的那篇文档。当对子文档进行相等匹配时,子文档必须精确匹配,而且两者的键的顺序也是有影响的。比如说,上述文档无法匹配如下查询:
db.factories.find( { metro: { state: "NY", city: "New York" } } )
参见 子文档查询 了解更多关于查询子文档的细节。