MongoDB 涵盖的查询

  • 涵盖的查询

    在本章中,我们将学习涵盖的查询。
  • 什么是涵盖查询?

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

    要测试涵盖的查询,请考虑用户集合中的以下文档:
    
    {
       "_id": ObjectId("53402597d852426020000003"),
       "contact": "987654321",
       "dob": "01-01-1991",
       "gender": "M",
       "name": "Tom Benzamin",
       "user_name": "tombenzamin"
    }
    
    我们将首先在users集合字段gender和user_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" }
    
    最后,请记住,如果-
    • 任何索引字段都是数组
    • 任何索引字段都是子文档