假如一個(gè) users 集合中具有下列文檔:
{
"address": {
"city": "Los Angeles",
"state": "California",
"pincode": "123"
},
"tags": [
"music",
"cricket",
"blogs"
],
"name": "Tom Benzamin"
}
上述文檔包含一個(gè)地址子文檔(address sub-document)與一個(gè)標(biāo)簽數(shù)組(tags array)。
假設(shè)我們想要根據(jù)標(biāo)簽來搜索用戶文檔。首先在集合中創(chuàng)建一個(gè)標(biāo)簽數(shù)組的索引。
反過來說,在標(biāo)簽數(shù)組上創(chuàng)建一個(gè)索引,也就為每一個(gè)字段創(chuàng)建了單獨(dú)的索引項(xiàng)。因此在該例中,當(dāng)我們創(chuàng)建了標(biāo)簽數(shù)組的索引時(shí),也就為它的music(音樂)、cricket(板球)以及 blog(博客)值創(chuàng)建了獨(dú)立的索引。
使用下列命令創(chuàng)建標(biāo)簽數(shù)據(jù)的索引:
>db.users.ensureIndex({"tags":1})
創(chuàng)建完該索引后,按照如下方式搜索集合中的標(biāo)簽字段:
>db.users.find({tags:"cricket"})
為了驗(yàn)證所使用索引的正確性,使用 explain 命令,如下所示:
>db.users.find({tags:"cricket"}).explain()
上述 explain 命令的執(zhí)行結(jié)果是 "cursor" : "BtreeCursor tags_1",表示使用了正確的索引。
假設(shè)需要根據(jù)市(city)、州(state)、個(gè)人身份號(hào)碼(pincode)字段來搜索文檔。因?yàn)樗羞@些字段都屬于地址子文檔字段的一部分,所以我們將在子文檔的所有字段上創(chuàng)建索引。
使用如下命令在子文檔的所有三個(gè)字段上創(chuàng)建索引:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
一旦創(chuàng)建了索引,就可以使用索引來搜索任何子文檔字段:
>db.users.find({"address.city":"Los Angeles"})
記住,查詢表達(dá)式必須遵循指定索引的順序。因此上面創(chuàng)建的索引將支持如下查詢:
>db.users.find({"address.city":"Los Angeles","address.state":"California"})
另外也支持如下這樣的查詢:
>db.users.find({"address.city":"LosAngeles","address.state":"California","address.pincode":"123"})