官方的MongoDB的文檔中說(shuō)明,覆蓋查詢(xún)是以下的查詢(xún):
由于所有出現(xiàn)在查詢(xún)中的字段是索引的一部分, MongoDB 無(wú)需在整個(gè)數(shù)據(jù)文檔中檢索匹配查詢(xún)條件和返回使用相同索引的查詢(xún)結(jié)果。
因?yàn)樗饕嬖谟赗AM中,從索引中獲取數(shù)據(jù)比通過(guò)掃描文檔讀取數(shù)據(jù)要快得多。
為了測(cè)試蓋索引查詢(xún),使用以下 users 集合:
{ "_id": ObjectId("53402597d852426020000002"), "contact": "987654321", "dob": "01-01-1991", "gender": "M", "name": "Tom Benzamin", "user_name": "tombenzamin" }
我們?cè)?users 集合中創(chuàng)建聯(lián)合索引,字段為 gender 和 user_name :
>db.users.ensureIndex({gender:1,user_name:1})
現(xiàn)在,該索引會(huì)覆蓋以下查詢(xún):
>db.users.find({gender:"M"},{user_name:1,_id:0})
也就是說(shuō),對(duì)于上述查詢(xún),MongoDB的不會(huì)去數(shù)據(jù)庫(kù)文件中查找。相反,它會(huì)從索引中提取數(shù)據(jù),這是非??焖俚臄?shù)據(jù)查詢(xún)。
由于我們的索引中不包括 _id 字段,_id在查詢(xún)中會(huì)默認(rèn)返回,我們可以在MongoDB的查詢(xún)結(jié)果集中排除它。
下面的實(shí)例沒(méi)有排除_id,查詢(xún)就不會(huì)被覆蓋:
>db.users.find({gender:"M"},{user_name:1})
最后,如果是以下的查詢(xún),不能使用覆蓋索引查詢(xún):