У меня есть связь между пользователями и фотографиями.Всякий раз, когда я выбираю для всех пользователей, я также хочу получить первые 5 фотографий для каждого пользователя.Это моя схема:
type User {
id: ID!
username: String!
email: String!
photos: [Photo!]!
}
type Photo {
id: ID!
url: String
thumb: String
name: String
postedBy: User!
}
type Query {
allUsers: [User!]!
}
Итак, в моем резольвере у меня есть:
{
Query: {
allUsers: async (parent, args, { models }) => {
return await models.User.find();
}
},
User: {
photos: async (parent, args, { models, loaders }) => {
return loaders.photoLoader.load(parent.id);
}
}
}
Так что, используя dataloader, я могу пакетировать все фотографии за один запрос, но я не могу найти способ также ограничитьколичество фотографий для каждого пользователя.
const batchPhotos = async (ids) => {
const { models: { Photo, User } } = db;
const photos = await Photo.find({ postedBy: ids });
// Something like Photo.find({ postedBy: ids }).limit(5) will bring
// first 5 results. I need to grab the first 5 for each user.
const photoById = keyBy(photos, 'postedBy');
return ids.map(id => photoById[id]);
}
export const photoLoader = () => new DataLoader(batchPhotos);