我知道有几个问题与此非常相似,但我还没有找到一个明确概述如何保持比赛后总数(在本例中为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>]
}
答案 0 :(得分:4)
你可以这样做:
$group
对先前$geonear
匹配的结果求和并推送$$ROOT
文档以保留记录$unwind
删除数组$skip
$limit
$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
,$limit
和preserveNullAndEmptyArrays
用于$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"
}
}
}])