位置:首頁 > 數據庫 > MongoDB教學 > MongoDB覆蓋查詢

MongoDB覆蓋查詢

什麼是涵蓋查詢

按照官方MongoDB的文檔,一個覆蓋查詢是一個查詢在:

  • 所有查詢中的字段是索引的一部分,並且
  • 所有在查詢返回的字段在相同的索引

由於所有出現在查詢中的字段是索引的一部分,MongoDB匹配查詢條件使用相同的索引,而無需實際尋找內部文檔返回結果。 因為索引存在於RAM中,從索引獲取數據比通過掃描文檔讀取數據要快得多。

使用覆蓋查詢

要測試覆蓋查詢,考慮以下文檔在用戶集合:

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

我們將首先為用戶集合創造的字段gender和user_name一個複合索引,使用下麵的查詢:

>db.users.ensureIndex({gender:1,user_name:1})
現在,索引將涵蓋以下查詢:

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

也就是說,對於上述查詢,MongoDB不會去查找數據庫中的文檔。相反,它會從索引中提取數據,這是非常快速的查詢所需數據。

由於我們的索引並不包括_id字段,我們必須明確地排除從查詢返回結果集作為MongoDB,默認在每個查詢_id字段。 所以下麵的查詢也不會覆蓋上麵創建的索引:

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

最後,請記住,索引不能覆蓋查詢,如果:

  • 任何索引字段是一個數組
  • 任何索引字段是一個子文檔