Grapeoff
@Grapeoff
В чём концепция...?

Почему skip и limit в aggregation pipeline работают не так, как у обычного find?

Раньше я делал пагинацию с помощью


await this.PupilModel.find().limit(limit).skip(offset) // limit и offset прилетают как requset.query

И если я хотел допустим открыть третью страницу, учитывая что на одной я отображаю 10 элементов, мне нужно было установить limit в значение 10, а offset в значение 20.

Но потом нужно было сделать фильтрацию и я использую для этих целей MongoDB Aggregation.

const result = await this.PupilModel.aggregate(
            this.createFilterPipeline(filters) || [{ $match: {} }]
        )
        .limit(limit)
        .skip(offset);


И теперь, если я хочу открыть вторую страницу, то limit будет в значении 10, как и offset. Выполняю запрос и получаю пустой массив:
610950e7db361574554294.png

Теперь, чтобы мне открыть вторую страницу, limit должен быть 20, а offset 10, а если третью страницу, то limit = 30, offset = 20

Почему так? Это какая-то особенность Aggregation Pipeline или ошибка в моём коде?
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
Aggregation pipeline выполняется один за другим, сначала вы ограничиваете вывод limit и у вас в выводе остаются только 10 записей, а потом вы двигаете курсор на 10 вперед и получаете пустоту, потому в выдаче после 10 не записей

Вам нужно в агрегации делать так:
либо так:
[
{ "$limit": skip + limit },
{ "$skip": skip }
]

либо так
[
{ "$skip": skip }
{ "$limit": limit },
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы