Вам нужно отсортировать документ по полю, а затем использовать skip & limit aggregation. Также для получения общего количества записей мы можем использовать фасет агрегирование.
Вот подробное объяснение:
Допустим, у вас есть эти 8 документов в коллекции заказов.
[
{
"_id": "5e390fc33285e463a0799689",
"customer": "Max",
"total": 10,
"orderDate": "2020-02-04T06:31:31.311Z",
"__v": 0
},
{
"_id": "5e390fd03285e463a079968a",
"customer": "John",
"total": 9.2,
"orderDate": "2020-02-04T06:31:44.190Z",
"__v": 0
},
{
"_id": "5e390fda3285e463a079968b",
"customer": "Smith",
"total": 11.3,
"orderDate": "2020-02-04T06:31:54.248Z",
"__v": 0
},
{
"_id": "5e390fdf3285e463a079968c",
"customer": "Smith",
"total": 12.3,
"orderDate": "2020-02-04T06:31:59.993Z",
"__v": 0
},
{
"_id": "5e390fec3285e463a079968d",
"customer": "Jimmy",
"total": 15.6,
"orderDate": "2020-02-04T06:32:12.336Z",
"__v": 0
},
{
"_id": "5e390ffd3285e463a079968e",
"customer": "Wesley",
"total": 11,
"orderDate": "2020-02-04T06:32:29.670Z",
"__v": 0
},
{
"_id": "5e3910163285e463a079968f",
"customer": "Adam",
"total": 6.1,
"orderDate": "2020-02-04T06:32:54.131Z",
"__v": 0
},
{
"_id": "5e3910213285e463a0799690",
"customer": "Michael",
"total": 7.2,
"orderDate": "2020-02-04T06:33:05.166Z",
"__v": 0
}
]
Если мы хотим получить эти документы в виде кусков, мы можем написать пример маршрута следующим образом:
router.get("/orders", async (req, res) => {
const page = req.query.pageIndex ? +req.query.pageIndex : 1;
const limit = req.query.pageSize ? +req.query.pageSize : 10;
const skip = (page - 1) * limit;
const result = await Order.aggregate([
{
$sort: {
orderDate: -1
}
},
{
$facet: {
totalRecords: [{ $count: "total" }],
data: [{ $skip: skip }, { $limit: limit }]
}
}
]);
res.send(result);
});
Мы отправляем параметры pageIndex и pageSize в строке запроса следующим образом http://...../orders?pageIndex=1&pageSize=3
Когда мы используем pageIndex=1
и pageSize=3
, результат будет таким: (как вы видите, мы также возвращаем общее количество записей, чтобы клиент мог построить числа нумерации страниц)
[
{
"totalRecords": [
{
"total": 8
}
],
"data": [
{
"_id": "5e3910213285e463a0799690",
"customer": "Michael",
"total": 7.2,
"orderDate": "2020-02-04T06:33:05.166Z",
"__v": 0
},
{
"_id": "5e3910163285e463a079968f",
"customer": "Adam",
"total": 6.1,
"orderDate": "2020-02-04T06:32:54.131Z",
"__v": 0
},
{
"_id": "5e390ffd3285e463a079968e",
"customer": "Wesley",
"total": 11,
"orderDate": "2020-02-04T06:32:29.670Z",
"__v": 0
}
]
}
]
Когда мы используем pageIndex=2
и pageSize=3
, результат будет таким:
[
{
"totalRecords": [
{
"total": 8
}
],
"data": [
{
"_id": "5e390fec3285e463a079968d",
"customer": "Jimmy",
"total": 15.6,
"orderDate": "2020-02-04T06:32:12.336Z",
"__v": 0
},
{
"_id": "5e390fdf3285e463a079968c",
"customer": "Smith",
"total": 12.3,
"orderDate": "2020-02-04T06:31:59.993Z",
"__v": 0
},
{
"_id": "5e390fda3285e463a079968b",
"customer": "Smith",
"total": 11.3,
"orderDate": "2020-02-04T06:31:54.248Z",
"__v": 0
}
]
}
]
Когда мы используем pageIndex=3
и pageSize=3
, результат будет таким:
[
{
"totalRecords": [
{
"total": 8
}
],
"data": [
{
"_id": "5e390fd03285e463a079968a",
"customer": "John",
"total": 9.2,
"orderDate": "2020-02-04T06:31:44.190Z",
"__v": 0
},
{
"_id": "5e390fc33285e463a0799689",
"customer": "Max",
"total": 10,
"orderDate": "2020-02-04T06:31:31.311Z",
"__v": 0
}
]
}
]
В вашем случае вам необходимо отправить 10 в качестве значения pageSize.