MongoDB 覆盖查询

MongoDB 覆盖查询

在本章中,我们将学习关于覆盖查询的内容。

什么是覆盖查询

根据官方的MongoDB文档,覆盖查询是指所有查询字段都是索引的一部分,并且查询返回的所有字段都在同一个索引中。

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

由于查询中的所有字段都是索引的一部分,MongoDB可以使用相同的索引匹配查询条件并返回结果,而不需要实际查看文档内部。由于索引存在于内存中,从索引中获取数据比通过扫描文档获取数据要快得多。

使用覆盖查询

为了测试覆盖查询,考虑以下位于 users 集合中的文档−

{
   "_id": ObjectId("53402597d852426020000003"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

我们首先将使用以下查询为 用户 集合的 性别用户名 字段创建一个复合索引。

>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" }

最后,请记住,如果发生以下情况,索引无法覆盖查询:

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程