在本章中,我們將了解覆蓋查詢(xún)。
根據(jù)官方MongoDB文檔,覆蓋查詢(xún)是一個(gè)查詢(xún),其中 -
由于查詢(xún)中存在的所有字段都是索引的一部分,所以MongoDB查詢(xún)指定條件匹配,并使用相同的索引返回結(jié)果,而不會(huì)實(shí)際查找文檔。由于索引存在于RAM/內(nèi)存中,與通過(guò)掃描文檔獲取數(shù)據(jù)相比,從索引獲取數(shù)據(jù)更快。
要測(cè)試覆蓋的查詢(xún),請(qǐng)?jiān)?code>users集合中考慮以下文檔 -
{
"_id": ObjectId("234324fd852426020001111"),
"contact": "13800138000",
"dob": "1991-11-11",
"gender": "M",
"name": "Maxsu",
"user_name": "user_maxsu"
}
首先使用以下查詢(xún)?cè)?code>users集合 的字段:gender 和 user_name 上創(chuàng)建一個(gè)復(fù)合索引 -
> db.users.ensureIndex({gender:1,user_name:1})
現(xiàn)在,這個(gè)索引將覆蓋以下查詢(xún) -
>db.users.find({gender:"M"},{user_name:1,_id:0})
也就是說(shuō),對(duì)于上述查詢(xún),MongoDB不會(huì)查找數(shù)據(jù)庫(kù)文檔。相反,它將從索引數(shù)據(jù)中獲取所需的數(shù)據(jù)。
由于索引不包括_id字段,在上面示例中,已經(jīng)將其從查詢(xún)的結(jié)果集中明確排除,因?yàn)镸ongoDB默認(rèn)情況下在每個(gè)查詢(xún)中返回_id字段。 所以下面的查詢(xún)不會(huì)在上面創(chuàng)建的索引中被覆蓋(查詢(xún)有返回_id字段) -
>db.users.find({gender:"M"},{user_name:1})
最后,請(qǐng)記住,如果有下列情況,則索引無(wú)法覆蓋查詢(xún) -