
- MongoDB 教程
- MongoDB - 首頁
- MongoDB - 概述
- MongoDB - 優勢
- MongoDB - 環境搭建
- MongoDB - 資料建模
- MongoDB - 建立資料庫
- MongoDB - 刪除資料庫
- MongoDB - 建立集合
- MongoDB - 刪除集合
- MongoDB - 資料型別
- MongoDB - 插入文件
- MongoDB - 查詢文件
- MongoDB - 更新文件
- MongoDB - 刪除文件
- MongoDB - 投影
- MongoDB - 限制記錄數
- MongoDB - 排序記錄
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 複製
- MongoDB - 分片
- MongoDB - 建立備份
- MongoDB - 部署
- MongoDB - Java
- MongoDB - PHP
- 高階 MongoDB
- MongoDB - 關係
- MongoDB - 資料庫引用
- MongoDB - 覆蓋查詢
- MongoDB - 分析查詢
- MongoDB - 原子操作
- MongoDB - 高階索引
- MongoDB - 索引限制
- MongoDB - ObjectId
- MongoDB - Map Reduce
- MongoDB - 文字搜尋
- MongoDB - 正則表示式
- 使用 Rockmongo
- MongoDB - GridFS
- MongoDB - 有帽集合
- 自動遞增序列
- MongoDB 有用資源
- MongoDB - 問答
- MongoDB - 快速指南
- MongoDB - 有用資源
- MongoDB - 討論
MongoDB - 覆蓋查詢
在本節中,我們將學習覆蓋查詢。
什麼是覆蓋查詢?
根據 MongoDB 官方文件,覆蓋查詢是指:
- 查詢中的所有欄位都是索引的一部分。
- 查詢中返回的所有欄位都在同一個索引中。
由於查詢中存在的所有欄位都是索引的一部分,MongoDB 使用同一個索引匹配查詢條件並返回結果,而無需實際檢視文件內部。由於索引存在於 RAM 中,因此與透過掃描文件獲取資料相比,從索引獲取資料要快得多。
使用覆蓋查詢
要測試覆蓋查詢,請考慮 users 集合中的以下文件:
{ "_id": ObjectId("53402597d852426020000003"), "contact": "987654321", "dob": "01-01-1991", "gender": "M", "name": "Tom Benzamin", "user_name": "tombenzamin" }
我們將首先使用以下查詢為 users 集合中的 gender 和 user_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" }
最後,請記住,如果以下情況,索引無法覆蓋查詢:
- 任何索引欄位都是陣列
- 任何索引欄位都是子文件
廣告