Как выбрать из коллекции субдокументы с пагинацией?

Выборка субдокументов с пагинацией из коллекции в MongoDB может быть выполнена с использованием агрегации и операторов $slice и $skip.

Предположим, у нас есть коллекция "users", в которой каждый документ содержит субдокумент "friends" - массив объектов, представляющих друзей пользователя. Мы хотим выбрать определенную страницу субдокументов "friends" с определенным количеством элементов на странице.

Для начала нам понадобится номер страницы (page) и количество элементов на странице (perPage). Затем мы можем использовать следующий запрос на агрегацию:

db.users.aggregate([
  {
    $project: {
      _id: 0,
      friends: 1,
      totalFriends: { $size: "$friends" }
    }
  },
  {
    $project: {
      friends: { $slice: ["$friends", { $multiply: [page, perPage] }, perPage] },
      totalFriends: 1
    }
  }
])

В этом запросе мы использовали два этапа проекции ($project). Первый этап добавляет поле "totalFriends", содержащее общее количество друзей в массиве "friends". Второй этап использует оператор $slice для выборки определенного диапазона элементов из массива "friends" с использованием значений page и perPage.

После выполнения этого запроса мы получим результаты в следующем формате:

{
  friends: [ /* массив субдокументов "friends" на данной странице */ ],
  totalFriends: /* общее количество друзей в коллекции */
}

Таким образом, мы выбрали субдокументы на определенной странице с указанием количества элементов на странице и также получили общее количество друзей в коллекции для определения необходимости пагинации.

Заметьте, что операторы $slice и $skip должны быть аккуратно использованы для оптимизации производительности. При работе с большими коллекциями или большим количеством субдокументов, рекомендуется использовать индексы для оптимизации запросов.