Я не могу заставить работать метод Mongoose Aggregate

Я создаю API, и я хотел использовать методы пропуска и ограничения в mongoose для обработки нумерации страниц. Я хотел бы получить общий размер документа вместе с данными о нумерации страниц. Первоначально я сделал два запроса: один для данных с разбивкой на страницы, а другой для общего размера документа. Это плохо, да? Я начал искать, есть ли встроенный способ справиться с этим в одном запросе. Я столкнулся с агрегатным методом. К сожалению, мне не удалось заставить его работать.

Вот мои коды с двумя запросами:

const page = req.query.page
 const {skip, searchlimit} = getPagination(params);
let transactionsData = []

const transactions = await TransactionModel.find({transactionOwnerId: user?._id}).sort({createdAt:-1})
  .skip(skip)
  .limit(searchlimit);

 totalDocumentSize = await TransactionModel.countDocuments({transactionOwnerId:   user?._id});

  transactionsData = transactions as transactionAttributes[];

console.info(transactionsData, totalDocumentSize)

Здесь я попробовал агрегатный метод:

 const me = await TransactionModel.aggregate([{
           $match: {transactionOwnerId: user?._id}
        }, 
         {
            $sort: {createdAt:-1}
         }
        
     ]);
console.info(me);

Я считаю, что неправильно применяю агрегированный метод. Он возвращает пустой массив. Как я могу использовать его для применения методов пропуска и ограничения, а также для получения общего размера документа?

🤔 А знаете ли вы, что...
С JavaScript можно создавать расширения для различных платформ, таких как Adobe Acrobat и Microsoft Office.


1
91
2

Ответы:

Решено

Вам стоит попробовать с $facet.

Попробуйте это. Я думаю, это сработает.

const me = await TransactionModel.aggregate([
      { $match: { transactionOwnerId: user?._id } },
      {
        $facet: {
          transactions: [
            { $sort: { createdAt: -1 } },
            { $skip: skip },
            { $limit: limit },
          ],
          totalDocumentSize: [
            { $count: 'count' }
          ]
        }
      }
    ]);

А затем извлеките каждую запись, используя...

const transactions = me[0].transactions;
const totalDocumentSize = me[0].totalDocumentSize[0]?.count || 0;

Примечание. Обязательно запустите этот запрос внутри функции async().


попробуй это!

    const page = parseInt(req.query.page) || 1;
    const limit = 10;

    const transactions = await TransactionModel.aggregate([
      {
        $match: {
          $expr: { $eq: ["$transactionOwnerId", { $toObjectId: user?._id }] },
        },
      },
      {
        $facet: {
          data: [
            {
              $skip: (page - 1) * limit,
            },
            {
              $limit: limit,
            },
            {
              $sort: { createdAt: -1 },
            },
          ],
          count: [
            {
              $count: "count",
            },
          ],
        },
      },
    ]);

    console.info(transactions);