- 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" }
最后,请记住,如果以下情况,索引无法覆盖查询:
- 任何索引字段都是数组
- 任何索引字段都是子文档
广告