Mongo aggregation with paginated data and totals

前端 未结 3 1238
日久生厌
日久生厌 2020-12-28 11:00

I\'ve crawled all over stack overflow, and have not found any info on how to return proper pagination data included in the resultset.

I\'m trying to aggregate some

相关标签:
3条回答
  • 2020-12-28 11:21

    A performance optimization tip:

    When you use $facet stage for pagination, Try to add it as soon as it's possible.

    For example: if you want to add $project or $lookup stage, add them after $facet, not before it.

    it will have impressive effect in aggregation speed. because $project stage require MongoDB to explore all documents and get involve with all fields(which is not necessary).

    0 讨论(0)
  • 2020-12-28 11:26

    If you have a lot of events, {$ push: "$$ ROOT"}, will make Mongo return an error, I have solved it with $facet (Only works with version 3.4+)

    aggregate([
        { $match: options },
        {
          $facet: {
            edges: [
              { $sort: sort },
              { $skip: skip },
              { $limit: limit },
            ],
            pageInfo: [
              { $group: { _id: null, count: { $sum: 1 } } },
            ],
          },
        },
      ])
    
    0 讨论(0)
  • 2020-12-28 11:27

    Did this in two steps instead of one:

    // Get the totals
    db.mongoAuditEvent.aggregate([{$group: {_id: "$corrId"}}, {$group: {_id: 1, total: {$sum: 1}}}]);
    
    // Get the data
    db.mongoAuditEvent.aggregate([
      {$group: {
        _id : "$corrId", 
        currentEvent: {"$last": "$event.status"}, 
        "events": { $push: "$$ROOT"}
      }},
      {$sort: {"events.timestamp": -1} }, // Latest first
      {$skip: 0 },
      {$limit: 10}
    ], {allowDiskUse: true}).pretty();
    

    I would be very happy if anybody got a better solution to this though.

    0 讨论(0)
提交回复
热议问题