MongoDB - 覆盖查询



在本节中,我们将学习覆盖查询。

什么是覆盖查询?

根据 MongoDB 官方文档,覆盖查询是指:

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

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

使用覆盖查询

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

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

我们将首先使用以下查询为 users 集合中的 genderuser_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" }

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

  • 任何索引字段都是数组
  • 任何索引字段都是子文档
广告