在这一章节中,我们来学习高级索引,假设users
集合的以下文档 -
{
"address": {
"city": "Haikou",
"province": "Hainan",
"pincode": "123456"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Maxsu"
}
上述文档包含地址子文档和标签数组。
索引数组字段
假设要根据用户的标签搜索用户文档。为此,我们将在集合中的tags
数组上创建一个索引。
在数组上创建一个索引依次为每个字段创建单独的索引条目。所以在这个例子中,当在tags
数组上创建一个索引时,将为其值music
,cricket
和blogs
创建单独的索引。
要在tags
数组上创建索引,请使用以下代码 -
>db.users.ensureIndex({"tags":1})
创建索引后,可以搜索这个集合的标签字段 -
>db.users.find({tags:"cricket"})
要验证是否使用正确的索引,请使用以下说明命令 -
>db.users.find({tags:"cricket"}).explain()
上面的命令生成:“cursor”:“BtreeCursor tags_1”
,它确认使用了正确的索引。
索引子文档字段
假设要搜索基于city
,province
和pincode
字段的文档。 由于所有这些字段都是地址子文档字段的一部分,因此将在子文档的所有字段上创建一个索引。
要在子文档的所有三个字段上创建索引,请使用以下代码 -
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
创建索引后,就可以使用此索引来搜索任何子文档的字段了,如下所示:
>db.users.find({"address.city":"Haikou"})
请记住,查询表达式必须遵循指定的索引的顺序。 所以上面创建的索引将支持以下查询 -
>db.users.find({"address.city":"Haikou","address.province":"Hainan"})
它还将支持以下查询 -
>db.users.find({"address.city":"Haikou","address.province":"Hainan",
"address.pincode":"12345"})