MongoDB - 涵盖查询

在本章中,我们将了解所涵盖的查询.

什么是涵盖查询?

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

  • 查询中的所有字段都是索引的一部分.

  • 查询中返回的所有字段都在同一索引中.

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

使用涵盖查询

要测试涵盖查询,请考虑用户集合中的以下文档 :

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


我们将首先创建一个化合物使用以下查询 : 字段性别 user_name 用户集合的索引;

>db.users.ensureIndex({gender:1,user_name:1})


现在,此索引将涵盖以下查询 :

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


也就是说,对于上述查询,MongoDB不会查看数据库文档.相反,它会从索引数据中获取所需数据,速度非常快.

由于我们的索引不包含 _id 字段,我们已明确将其从结果集中排除我们的查询,因为MongoDB默认在每个查询中返回_id字段.因此,上面创建的索引中不会包含以下查询 :

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

最后,请记住,索引不能覆盖查询,如果:

  • 任何索引字段都是数组

  • 任何索引字段都是子文档