在每一個(gè) MongoDB 官方文檔中,覆蓋查詢都具有以下兩個(gè)特點(diǎn):
既然查詢中的所有字段都屬于一個(gè)索引,MongoDB 就會(huì)利用同一索引,匹配查詢集合并返回結(jié)果,而不需要實(shí)際地查看文檔。因?yàn)樗饕嬖谟?RAM 中,從索引中獲取數(shù)據(jù)要比通過(guò)掃描文檔獲取數(shù)據(jù)快得多。
為了測(cè)試覆蓋查詢,假設(shè)在一個(gè) users 集合中包含下列文檔:
{
"_id": ObjectId("53402597d852426020000002"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
下面我們將為 users 集合中的 gender 和 user_name 字段創(chuàng)建一個(gè)符合索引。使用下列查詢:
>db.users.ensureIndex({gender:1,user_name:1})
這一索引將覆蓋下列查詢:
>db.users.find({gender:"M"},{user_name:1,_id:0})
也就是說(shuō),對(duì)于上面的查詢,MongoDB 不會(huì)去查看文檔,轉(zhuǎn)而從索引數(shù)據(jù)中獲取所需的數(shù)據(jù),這顯然要快得多。
既然索引不包含 _id 字段,那么當(dāng)查詢中默認(rèn)返回 _id 時(shí),我們可以在 MongoDB 的查詢結(jié)果集中將其排除掉。下面的查詢就不會(huì)被覆蓋。
>db.users.find({gender:"M"},{user_name:1})
最后,需要記住的是,如果出現(xiàn)下列情況,索引不能覆蓋查詢: