Выборка субдокументов с пагинацией из коллекции в 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 должны быть аккуратно использованы для оптимизации производительности. При работе с большими коллекциями или большим количеством субдокументов, рекомендуется использовать индексы для оптимизации запросов.