1 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
我找到了一種方法來獲取查詢的結(jié)果,并在同一次“旅行”中對(duì)數(shù)據(jù)庫(kù)進(jìn)行計(jì)數(shù)(仍然是 2 個(gè)查詢,但在數(shù)據(jù)庫(kù)中,因此速度要快得多)
關(guān)鍵是使用$facet(mongodb 3.4+):
const pipeline = [
{YOUR_QUERY},
{
$facet: {
paginatedResults: [{$skip: startIndex}, {$limit: limit}],
totalCount: [{$count: 'count'}]
}
},
{
$addFields: {
total: {
$ifNull: [{ $arrayElemAt: ['$totalCount.count', 0]}, 0]
}
}
},
{
$project: {
paginatedResults: 1,
total: 1
}
}
]
解釋:$facet在同一個(gè)輸入(我們的查詢結(jié)果)上執(zhí)行多個(gè)管道,我們可以有 1 個(gè)管道用于對(duì)結(jié)果進(jìn)行分頁(yè),1 個(gè)用于計(jì)算總數(shù)。
由于$count返回一個(gè)包含該count字段的對(duì)象,并且 facet 包裝在一個(gè)數(shù)組中,因此$addFields管道將實(shí)際count值提取為一個(gè)total字段。然后我只是用來$project刪除不再需要的totalCount,這就是結(jié)果:
{
paginatedResults: [RESULTS],
total: 34
}
添加回答
舉報(bào)