Я пытаюсь получить общее количество документов, которые соответствуют моим операторам конвейера, и затем после того, как я получу это количество всех них, я хотел бы использовать $skip
и $limit
, чтобы вернуть подмножество для разбивки на страницы. Сейчас я в основном выполняю одну и ту же агрегацию дважды - один раз, чтобы подсчитать все совпадения, и один раз, чтобы пропустить / ограничить. Можно ли это сделать с помощью одного конвейера агрегации?
Чтобы получить счет, я делаю
let [count] = await MyModel.aggregate([
{
$match: {
store: mongoose.Types.ObjectId(storeId),
},
},
{
$lookup: {
from: "resaleitems",
let: {
store: "$store",
},
as: "itemsForSale",
pipeline: [
{
$match: {
$expr: {
$eq: ["$store", "$$store"],
},
},
},
],
},
},
{
$match: {
"itemsForSale.0": { $exists: true },
},
},
{ $count: "totalCount" },
]).exec();
, а затем сразу после получения пропущенных и ограниченных результатов, которые я делаю в принципе то же самое, но добавили шаги $ skip и $ limit
let items = await MyModel.aggregate([
{
$match: {
store: mongoose.Types.ObjectId(storeId),
},
},
{ $skip: skip.toNumber() },
{ $limit: bnLimit.toNumber() },
{
$lookup: {
from: "resaleitems",
let: {
store: "$store",
},
as: "itemsForSale",
pipeline: [
{
$match: {
$expr: {
$eq: ["$store", "$$store"],
},
},
},
],
},
},
{
$match: {
"itemsForSale.0": { $exists: true },
},
},
]).exec();