鍍金池/ 教程/ 數(shù)據(jù)庫/ MongoDB覆蓋查詢
MongoDB教程
MongoDB覆蓋查詢
MongoDB數(shù)據(jù)建模
MongoDB聚合
MongoDB更改用戶密碼和自定義數(shù)據(jù)
MongoDB用戶
MongoDB分片
MongoDB創(chuàng)建集合
MongoDB文本搜索
MongoDB數(shù)據(jù)類型
MongoDB GridFS
MongoDB索引限制
MongoDB插入文檔
MongoDB刪除集合
MongoDB數(shù)據(jù)庫引用
MongoDB復(fù)制
MongoDB Map Reduce
Python連接MongoDB操作
MongoDB原子操作
MongoDB特點(diǎn)
MongoDB安全檢查表
MongoDB排序記錄
MongoDB自動遞增序列
MongoDB安裝配置(Windows)
MongoDB備份與恢復(fù)
MongoDB安裝配置(Ubuntu)
Ruby連接MongoDB操作
MongoDB部署
MongoDB索引
MongoDB分析查詢
MongoDB投影(選擇字段)
MongoDB刪除數(shù)據(jù)庫
MongoDB認(rèn)證
MongoDB限制記錄數(shù)
MongoDB添加用戶
MongoDB固定循環(huán)集合
MongoDB高級索引
MongoDB數(shù)據(jù)庫的優(yōu)點(diǎn)
MongoDB快速入門
MongoDB創(chuàng)建數(shù)據(jù)庫
MongoDB啟用身份驗(yàn)證
MongoDB歷史
MongoDB管理用戶和角色
MongoDB安裝配置(RedHat/CentOS)
MongoDB刪除文檔
Java連接MongoDB操作
MongoDB正則表達(dá)式
MongoDB查詢文檔
MongoDB關(guān)聯(lián)關(guān)系
PHP連接MongoDB操作
MongoDB更新文檔
MongoDB ObjectId

MongoDB覆蓋查詢

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

什么是覆蓋查詢?

根據(jù)官方MongoDB文檔,覆蓋查詢是一個查詢,其中 -

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

由于查詢中存在的所有字段都是索引的一部分,所以MongoDB查詢指定條件匹配,并使用相同的索引返回結(jié)果,而不會實(shí)際查找文檔。由于索引存在于RAM/內(nèi)存中,與通過掃描文檔獲取數(shù)據(jù)相比,從索引獲取數(shù)據(jù)更快。

使用覆蓋查詢

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

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

首先使用以下查詢在users集合 的字段:genderuser_name 上創(chuàng)建一個復(fù)合索引 -

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

現(xiàn)在,這個索引將覆蓋以下查詢 -

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

也就是說,對于上述查詢,MongoDB不會查找數(shù)據(jù)庫文檔。相反,它將從索引數(shù)據(jù)中獲取所需的數(shù)據(jù)。

由于索引不包括_id字段,在上面示例中,已經(jīng)將其從查詢的結(jié)果集中明確排除,因?yàn)镸ongoDB默認(rèn)情況下在每個查詢中返回_id字段。 所以下面的查詢不會在上面創(chuàng)建的索引中被覆蓋(查詢有返回_id字段) -

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

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

  • 任何索引的字段是一個數(shù)組
  • 任何索引的字段是一個子文檔