•   MongoDB教程
  • MongoDB快速入门
  • MongoDB历史
  • MongoDB特点
  • MongoDB数据库的优点
  • MongoDB安装配置(Windows)
  • MongoDB安装配置(Ubuntu)
  • MongoDB安装配置(RedHat/CentOS)
  • MongoDB数据建模
  • MongoDB创建数据库
  • MongoDB删除数据库
  • MongoDB创建集合
  • MongoDB删除集合
  • MongoDB数据类型
  • MongoDB插入文档
  • MongoDB查询文档
  • MongoDB更新文档
  • MongoDB删除文档
  • MongoDB投影(选择字段)
  • MongoDB限制记录数
  • MongoDB排序记录
  • MongoDB索引
  • MongoDB聚合
  • MongoDB复制
  • MongoDB分片
  • MongoDB备份与恢复
  • MongoDB部署
  • Java连接MongoDB操作
  • Python连接MongoDB操作
  • PHP连接MongoDB操作
  • Ruby连接MongoDB操作
  • 高级部分
  • MongoDB关联关系
  • MongoDB数据库引用
  • MongoDB覆盖查询
  • MongoDB分析查询
  • MongoDB原子操作
  • MongoDB高级索引
  • MongoDB索引限制
  • MongoDB ObjectId
  • MongoDB Map Reduce
  • MongoDB文本搜索
  • MongoDB正则表达式
  • MongoDB GridFS
  • MongoDB固定循环集合
  • MongoDB自动递增序列
  • 用户及安全
  • MongoDB安全检查表
  • MongoDB认证
  • MongoDB用户
  • MongoDB添加用户
  • MongoDB启用身份验证
  • MongoDB管理用户和角色
  • MongoDB更改用户密码和自定义数据

MongoDB覆盖查询

在本章中,我们将了解覆盖查询。

什么是覆盖查询?

根据官方MongoDB文档,覆盖查询是一个查询,其中 -

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

由于查询中存在的所有字段都是索引的一部分,所以MongoDB查询指定条件匹配,并使用相同的索引返回结果,而不会实际查找文档。由于索引存在于RAM/内存中,与通过扫描文档获取数据相比,从索引获取数据更快。

使用覆盖查询

要测试覆盖的查询,请在users集合中考虑以下文档 -

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

首先使用以下查询在users集合 的字段: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字段。 所以下面的查询不会在上面创建的索引中被覆盖(查询有返回_id字段) -

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

最后,请记住,如果有下列情况,则索引无法覆盖查询 -

  • 任何索引的字段是一个数组
  • 任何索引的字段是一个子文档

上一篇:MongoDB数据库引用下一篇:MongoDB分析查询