位置:首页 > 数据库 > MongoDB在线教程 > MongoDB覆盖查询

MongoDB覆盖查询

什么是涵盖查询

按照官方MongoDB的文档,一个覆盖查询是一个查询在:

  • 所有查询中的字段是索引的一部分,并且
  • 所有在查询返回的字段在相同的索引

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

使用覆盖查询

要测试覆盖查询,考虑以下文档在用户集合:

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

我们将首先为用户集合创造的字段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字段。 所以下面的查询也不会覆盖上面创建的索引:

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

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

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