MongoDB - 覆蓋查詢



在本節中,我們將學習覆蓋查詢。

什麼是覆蓋查詢?

根據 MongoDB 官方文件,覆蓋查詢是指:

  • 查詢中的所有欄位都是索引的一部分。
  • 查詢中返回的所有欄位都在同一個索引中。

由於查詢中存在的所有欄位都是索引的一部分,MongoDB 使用同一個索引匹配查詢條件並返回結果,而無需實際檢視文件內部。由於索引存在於 RAM 中,因此與透過掃描文件獲取資料相比,從索引獲取資料要快得多。

使用覆蓋查詢

要測試覆蓋查詢,請考慮 users 集合中的以下文件:

{
   "_id": ObjectId("53402597d852426020000003"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

我們將首先使用以下查詢為 users 集合中的 genderuser_name 欄位建立複合索引:

>db.users.createIndex({gender:1,user_name:1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

現在,此索引將覆蓋以下查詢:

>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }

也就是說,對於上述查詢,MongoDB 不會去檢視資料庫文件。相反,它會從索引資料中獲取所需的資料,這非常快。

由於我們的索引不包含 _id 欄位,因此我們已在查詢的結果集中明確排除了它,因為 MongoDB 預設在每個查詢中都返回 _id 欄位。因此,以下查詢不會被上面建立的索引覆蓋:

>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }

最後,請記住,如果以下情況,索引無法覆蓋查詢:

  • 任何索引欄位都是陣列
  • 任何索引欄位都是子文件
廣告