MongoDB - 高级索引

考虑用户集合的以下文档 :

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

上述文件包含地址子文档标记数组.

索引数组字段

假设我们要根据用户的标签搜索用户文档.为此,我们将在集合中的tags数组上创建索引.

依次在数组上创建索引会为其每个字段创建单独的索引条目.因此,在我们的情况下,当我们在tags数组上创建索引时,将为其值music,cricket和blogs创建单独的索引.

要在tags数组上创建索引,请使用以下代码 :

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

创建索引后,我们可以搜索集合的tags字段,如下所示;

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

要验证是否使用了正确的索引,请使用以下 explain 命令 :

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

上面的命令导致"游标":"BtreeCursor tags_1"确认使用了正确的索引.

索引子文档字段

假设我们想要根据城市,州和密码字段搜索文档.由于所有这些字段都是地址子文档字段的一部分,我们将在子文档的所有字段上创建索引.

用于在所有三个字段上创建索引子文档,使用以下代码 :

>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"})