发布于 2015-07-10 16:18:49 | 325 次阅读 | 评论: 0 | 来源: 网络整理
按照官方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})
最后,请记住,索引不能覆盖查询,如果: