MongoDB覆蓋查詢


在本章中,我們將了解覆蓋查詢。

什麼是覆蓋查詢?

根據官方MongoDB文件,覆蓋查詢是一個查詢,其中 -

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

由於查詢中存在的所有欄位都是索引的一部分,所以MongoDB查詢指定條件匹配,並使用相同的索引返回結果,而不會實際查詢文件。由於索引存在於RAM/記憶體中,與通過掃描文件獲取資料相比,從索引獲取資料更快。

使用覆蓋查詢

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

{
   "_id": ObjectId("234324fd852426020001111"),
   "contact": "13800138000",
   "dob": "1991-11-11",
   "gender": "M",
   "name": "Maxsu",
   "user_name": "user_maxsu"
}

首先使用以下查詢在users集合 的欄位:genderuser_name 上建立一個複合索引 -

> db.users.ensureIndex({gender:1,user_name:1})

現在,這個索引將覆蓋以下查詢 -

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

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

由於索引不包括_id欄位,在上面範例中,已經將其從查詢的結果集中明確排除,因為MongoDB預設情況下在每個查詢中返回_id欄位。 所以下面的查詢不會在上面建立的索引中被覆蓋(查詢有返回_id欄位) -

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

最後,請記住,如果有下列情況,則索引無法覆蓋查詢 -

  • 任何索引的欄位是一個陣列
  • 任何索引的欄位是一個子文件