离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-07-19 23:00:42

高级索引

假如一个 users 集合中具有下列文档:

{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

上述文档包含一个地址子文档(address sub-document)与一个标签数组(tags array)。

索引数组字段

假设我们想要根据标签来搜索用户文档。首先在集合中创建一个标签数组的索引。

反过来说,在标签数组上创建一个索引,也就为每一个字段创建了单独的索引项。因此在该例中,当我们创建了标签数组的索引时,也就为它的music(音乐)、cricket(板球)以及 blog(博客)值创建了独立的索引。

使用下列命令创建标签数据的索引:

>db.users.ensureIndex({"tags":1})

创建完该索引后,按照如下方式搜索集合中的标签字段:

>db.users.find({tags:"cricket"})

为了验证所使用索引的正确性,使用 explain 命令,如下所示:

>db.users.find({tags:"cricket"}).explain()

上述 explain 命令的执行结果是 "cursor" : "BtreeCursor tags_1",表示使用了正确的索引。

索引子文档字段

假设需要根据市(city)、州(state)、个人身份号码(pincode)字段来搜索文档。因为所有这些字段都属于地址子文档字段的一部分,所以我们将在子文档的所有字段上创建索引。

使用如下命令在子文档的所有三个字段上创建索引:

>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

一旦创建了索引,就可以使用索引来搜索任何子文档字段:

>db.users.find({"address.city":"Los Angeles"})

记住,查询表达式必须遵循指定索引的顺序。因此上面创建的索引将支持如下查询:

>db.users.find({"address.city":"Los Angeles","address.state":"California"})

另外也支持如下这样的查询:

>db.users.find({"address.city":"LosAngeles","address.state":"California","address.pincode":"123"})

上一篇: 原子操作 下一篇: 索引限制