Я создаю 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.
Вам стоит попробовать с $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);