在這一章節(jié)中,我們來學(xué)習(xí)高級索引,假設(shè)users集合的以下文檔 -
{
"address": {
"city": "Haikou",
"province": "Hainan",
"pincode": "123456"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Maxsu"
}
上述文檔包含地址子文檔和標(biāo)簽數(shù)組。
假設(shè)要根據(jù)用戶的標(biāo)簽搜索用戶文檔。為此,我們將在集合中的tags數(shù)組上創(chuàng)建一個索引。
在數(shù)組上創(chuàng)建一個索引依次為每個字段創(chuàng)建單獨的索引條目。所以在這個例子中,當(dāng)在tags數(shù)組上創(chuàng)建一個索引時,將為其值music,cricket和blogs創(chuàng)建單獨的索引。
要在tags數(shù)組上創(chuàng)建索引,請使用以下代碼 -
>db.users.ensureIndex({"tags":1})
創(chuàng)建索引后,可以搜索這個集合的標(biāo)簽字段 -
>db.users.find({tags:"cricket"})
要驗證是否使用正確的索引,請使用以下說明命令 -
>db.users.find({tags:"cricket"}).explain()
上面的命令生成:“cursor”:“BtreeCursor tags_1”,它確認(rèn)使用了正確的索引。
假設(shè)要搜索基于city,province和pincode字段的文檔。 由于所有這些字段都是地址子文檔字段的一部分,因此將在子文檔的所有字段上創(chuàng)建一個索引。
要在子文檔的所有三個字段上創(chuàng)建索引,請使用以下代碼 -
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
創(chuàng)建索引后,就可以使用此索引來搜索任何子文檔的字段了,如下所示:
>db.users.find({"address.city":"Haikou"})
請記住,查詢表達(dá)式必須遵循指定的索引的順序。 所以上面創(chuàng)建的索引將支持以下查詢 -
>db.users.find({"address.city":"Haikou","address.province":"Hainan"})
它還將支持以下查詢 -
>db.users.find({"address.city":"Haikou","address.province":"Hainan",
"address.pincode":"12345"})