# MongoDB 覆蓋索引查詢
官方的MongoDB的文檔中說明,覆蓋查詢是以下的查詢:
* 所有的查詢字段是索引的一部分
* 所有的查詢返回字段在同一個索引中
由于所有出現在查詢中的字段是索引的一部分, MongoDB 無需在整個數據文檔中檢索匹配查詢條件和返回使用相同索引的查詢結果。
因為索引存在于RAM中,從索引中獲取數據比通過掃描文檔讀取數據要快得多。
## 使用覆蓋索引查詢
為了測試蓋索引查詢,使用以下 users 集合:
```
{
"_id": ObjectId("53402597d852426020000002"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
```
我們在 users 集合中創建聯合索引,字段為 gender 和 user_name :
```
>db.users.ensureIndex({gender:1,user_name:1})
```
現在,該索引會覆蓋以下查詢:
```
>db.users.find({gender:"M"},{user_name:1,_id:0})
```
也就是說,對于上述查詢,MongoDB的不會去數據庫文件中查找。相反,它會從索引中提取數據,這是非常快速的數據查詢。
由于我們的索引中不包括 _id 字段,_id在查詢中會默認返回,我們可以在MongoDB的查詢結果集中排除它。
下面的實例沒有排除_id,查詢就不會被覆蓋:
```
>db.users.find({gender:"M"},{user_name:1})
```
最后,如果是以下的查詢,不能使用覆蓋索引查詢:
* 所有索引字段是一個數組
- NoSQL 簡介
- 什么是MongoDB ?
- window平臺安裝 MongoDB
- Linux平臺安裝MongoDB
- MongoDB 數據庫,對象,集合
- MongoDB - 連接
- PHP安裝MongoDB擴展驅動
- MongoDB 數據插入
- MongoDB使用update()函數更新數據
- MongoDB使用- remove()函數刪除數據
- MongoDB 查詢
- MongoDB條件操作符
- MongoDB條件操作符 - $type
- MongoDB Limit與Skip方法
- MongoDB 排序
- MongoDB 索引
- MongoDB 聚合
- MongoDB 復制(副本集)
- MongoDB 分片
- MongoDB 備份(mongodump)與恢復(mongorerstore)
- MongoDB 監控
- MongoDB Java
- MongoDB PHP
- MongoDB 關系
- MongoDB 數據庫引用
- MongoDB 覆蓋索引查詢
- MongoDB 查詢分析
- MongoDB 原子操作
- MongoDB 高級索引
- MongoDB 索引限制
- MongoDB ObjectId
- MongoDB Map Reduce
- MongoDB 全文檢索
- MongoDB 正則表達式
- MongoDB 管理工具: Rockmongo
- MongoDB GridFS
- MongoDB 固定集合(Capped Collections)
- MongoDB 自動增長
- 免責聲明