在$ facet中使用$ sort和$ limit时,Mongo聚合缓慢

时间:2019-02-09 16:47:00

标签: database mongodb performance wiredtiger

我注意到,至少从概念上来说,在相同的集合中存在巨大的性能差异。测试是在一个简单的集合结构上进行的,该结构具有_id,名称和createdAt,但其中有2000万个。在createdAt上有一个索引。它托管在mlab群集上,版本为3.6.9 WiredTiger。

我正在尝试使用聚合进行简单的分页,我知道我可以使用find和limit,但是我想在管道中添加更多元素,我给出的示例非常简洁。

db.getCollection("runnablecalls").aggregate([
         {
          $facet: {
            docs: [
                { $sort:  {createdAt: -1} },
                { $limit:  25 },
                { $skip:  0 },                                
            ],
            page_info: [
              { $group: { _id: null, total: { $sum: 1 } } 
              }
            ],
          }
        }                           
      ])

这几乎需要40s。现在,如果我将$sort$limit移动到构面之外,则需要0.042s

db.getCollection("runnablecalls").aggregate([
        { $sort:  {createdAt: -1} },
        { $limit:  25 }, 
        {
          $facet: {
            docs: [           
                { $skip:  0 },                
            ],            
            page_info: [
                { 
                  $group: { _id: null, total: { $sum: 1 } } 
                } 
            ]}
        },                           
      ])

page_info构面最后没有任何区别,我可以将其无差别地取出,我只是将其留在里面,因为我喜欢使用它。我知道如何使用两个查询(一个计数和一个不带$facet的聚合)来解决问题。我只想了解为什么会这样。

1 个答案:

答案 0 :(得分:0)

第一次聚合不使用索引。第二个聚合使用索引,并在输入$facet之前过滤掉前25个文档。您可以添加explain('executionStats')来查看查询计划和索引用法。例如,

db.getCollection("runnablecalls").explain('executionStats').aggregate([
         {
          $facet: {
            docs: [
                { $sort:  {createdAt: -1} },
                { $limit:  25 },
                { $skip:  0 },                                
            ],
            page_info: [
              { $group: { _id: null, total: { $sum: 1 } } 
              }
            ],
          }
        }                           
      ])