OPTIONS
翻译或纠错本页面

单键索引

MongoDB完整支持对 集合文档 的任一键建立索引。每个集合默认都有一个 _id键 索引,而且应用和用户可以另外添加索引来支持重要的查询和操作。

MongoDB支持的索引可以包含单个键 或者 多个键,这取决于该索引想支持的操作。本文档描述的是只包含一个键的索引。以下是一个单键索引的示例。

Diagram of an index on the ``score`` field (ascending).

Diagram of an index on the score field (ascending).

参见

复合索引 来了解更多关于可以包含多个索引的键, 以及 索引介绍 是在一个更高层次上介绍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 键的值就是一个子文档,包含了内嵌的键: citystate。以下命令可以基于整个 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" } } )

参见 子文档查询 了解更多关于查询子文档的细节。

←   索引类型 复合索引  →