是否在分页前获取MongoDB(聚合)匹配的文档总数加上结果?
我知道有几个问题与此非常相似,但我还没有找到一个问题清楚地概述了如何在匹配后(在本例中为geoNear)但在跳过/限制操作之前以及跳过/限制结果之前保持总计数 我当前的聚合管道是:是否在分页前获取MongoDB(聚合)匹配的文档总数加上结果?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我知道有几个问题与此非常相似,但我还没有找到一个问题清楚地概述了如何在匹配后(在本例中为geoNear)但在跳过/限制操作之前以及跳过/限制结果之前保持总计数 我当前的聚合管道是: [ { '$geoNear': { near: [Object], maxDistance: 4000, distanceField: 'distance', spherical: true, query: {} } }, { '$sort':
[ { '$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
仅使用sum amount和JSON数组格式化最终结果$group
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
。我已经更新了我的帖子