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

是否在分页前获取MongoDB(聚合)匹配的文档总数加上结果?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我知道有几个问题与此非常相似,但我还没有找到一个问题清楚地概述了如何在匹配后(在本例中为geoNear)但在跳过/限制操作之前以及跳过/限制结果之前保持总计数 我当前的聚合管道是: [ { '$geoNear': { near: [Object], maxDistance: 4000, distanceField: 'distance', spherical: true, query: {} } }, { '$sort':

我知道有几个问题与此非常相似,但我还没有找到一个问题清楚地概述了如何在匹配后(在本例中为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>]
}
{
总数:123,
结果:[]
}
您可以执行以下操作:

  • 1
    $group
    对上一个
    $geonear
    匹配的结果求和,并按
    $$ROOT
    文档保存记录
  • 1
    $unwind
    移除阵列所需
  • 您的
    $skip
  • 您的
    $limit
  • 1 last
    $group
    仅使用sum amount和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
$limit
以及
preserveNullandEmptyArray
作为
$unwind
部分,以确保结果为空
数组:

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"
        }
    }
}])
你可以做:

  • 1
    $group
    对上一个
    $geonear
    匹配的结果求和,并按
    $$ROOT
    文档保存记录
  • 1
    $unwind
    移除阵列所需
  • 您的
    $skip
  • 您的
    $limit
  • 1 last
    $group
    仅使用sum amount和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
$limit
以及
preserveNullandEmptyArray
作为
$unwind
部分,以确保结果为空
数组:

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"
        }
    }
}])

太棒了,这太完美了!但是有一个问题,如果我有一个跳过&限制,没有显示结果(即一个没有结果的页面),即使geoNear找到结果,也没有总计数。这有什么问题吗?你有一些样本数据供我测试吗?您能否确认,如果运行所有aggreg直到
$group
为止,它是否返回非空结果?以下是我正在使用的数据(目前只有2条记录,但已将分页设置为每页1条记录、每页2条记录等)。是的,两个结果都会在第一个
$group
之前返回。使用1页分页,当
$skip
$limit
中有数据时,我得到:
[{id:0,total:2,results:[]}]
但当没有页面数据时,我得到一个空数组
[]
。我的猜测是,只有当results.length>0时,最终的“格式化”组才有效,因此该组根本不显示。是的,您可以使用
$slice
而不是
$skip
/
$limit
对数组进行切片。它将返回一个空的
[]
,而
$unwind
将为此目的获取一个
preserveNullAndEmptyArrays
。我已经更新了我的postBrilliant,这太完美了!但是有一个问题,如果我有一个跳过&限制,没有显示结果(即一个没有结果的页面),即使geoNear找到结果,也没有总计数。这有什么问题吗?你有一些样本数据供我测试吗?您能否确认,如果运行所有aggreg直到
$group
为止,它是否返回非空结果?以下是我正在使用的数据(目前只有2条记录,但已将分页设置为每页1条记录、每页2条记录等)。是的,两个结果都会在第一个
$group
之前返回。使用1页分页,当
$skip
$limit
中有数据时,我得到:
[{id:0,total:2,results:[]}]
但当没有页面数据时,我得到一个空数组
[]
。我的猜测是,只有当results.length>0时,最终的“格式化”组才有效,因此该组根本不显示。是的,您可以使用
$slice
而不是
$skip
/
$limit
对数组进行切片。它将返回一个空的
[]
,而
$unwind
将为此目的获取一个
preserveNullAndEmptyArrays
。我已经更新了我的帖子