在分页加结果之前获取MongoDB(聚合)匹配的文档总数?

时间:2016-10-31 00:48:59

标签: mongodb mongodb-query aggregation-framework

我知道有几个问题与此非常相似,但我还没有找到一个明确概述如何保持比赛后总数(在本例中为geoNear)的问题,但在跳过/限制操作之前,以及跳过/限制结果。

我当前的汇总管道是:

[ { '$geoNear': 
     { near: [Object],
       maxDistance: 4000,
       distanceField: 'distance',
       spherical: true,
       query: {} } },
  { '$sort': { distance: 1 } },
  { '$skip': 0 },
  { '$limit': 20 } ]

理想情况下,我希望返回这样的内容:

{
  total: 123,
  results: [<results respecting $skip & $limit>]
}

1 个答案:

答案 0 :(得分:4)

你可以这样做:

  • 1 $group对先前$geonear匹配的结果求和并推送$$ROOT文档以保留记录
  • 1 $unwind删除数组
  • 您的$skip
  • 您的$limit
  • 1最后$group格式化最终结果,仅包含金额和JSON数组

查询是:

db.coll.aggregate([{
    $geoNear: {
        near: [Object],
        maxDistance: 4000,
        distanceField: 'distance',
        spherical: true,
        query: {}
    }
}, {
    $sort: {
        distance: 1
    }
}, {
    $group: {
        _id: 0,
        count: {
            $sum: 1
        },
        document: {
            $push: "$$ROOT"
        }
    }
}, {
    $unwind: "$document"
}, {
    $skip: 0
}, {
    $limit: 20
}, {
    $group: {
        _id: 0,
        total: {
            $first: "$count"
        },
        results: {
            $push: "$document"
        }
    }
}])

您可以使用$slice代替$skip$limitpreserveNullAndEmptyArrays用于$unwind部分,以确保空result数组:< / p>

db.coll.aggregate([{
    $geoNear: {
        near: [Object],
        maxDistance: 4000,
        distanceField: 'distance',
        spherical: true,
        query: {}
    }
}, {
    $sort: {
        distance: 1
    }
}, {
    $group: {
        _id: 0,
        count: {
            $sum: 1
        },
        document: {
            $push: "$$ROOT"
        }
    }
}, {
    $project: {
        count: 1,
        document: { $slice: ["$document", 0, 20] }
    }
}, {
    $unwind: { path: "$document", preserveNullAndEmptyArrays: true }
}, {
    $group: {
        _id: 0,
        total: {
            $first: "$count"
        },
        results: {
            $push: "$document"
        }
    }
}])