ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как в $project при совмещение данных с помощью $lookup указать только определенные поля?

Всем привет.
Есть две коллекции, при выборки с помощью aggregate, присоеденяю коллекцию с пользователем по ID
Вот так:
return Posts
        .aggregate([
            { $match: request.query },
            { $sort: request.sort },
            { $skip: request.skip },
            { $limit: request.limit },
            {
                $lookup: {
                    from: 'users',
                    localField: 'owner',
                    foreignField: '_id',
                    as: 'owner'
                }
            }
        ])


Естественно поле owner содержить массив с объектом всех полей документа пользователя, а мне нужно всего 2 поля (_id and username)
Пишу следующее
return Posts
        .aggregate([
            { $match: request.query },
            { $sort: request.sort },
            { $skip: request.skip },
            { $limit: request.limit },
            {
                $lookup: {
                    from: 'users',
                    localField: 'owner',
                    foreignField: '_id',
                    as: 'owner'
                }
            }, {
                $project: {
                    _id: 1,
                    name: 1,
                    items: 1,
                    premiumAt: 1,
                    owner: {
                        _id: { $arrayElemAt: [ '$owner._id', 0 ] },
                        username: { $arrayElemAt: [ '$owner.username', 0 ] }
                    },
                    photos: { $arrayElemAt: [ '$photos', 0 ] },
                    comments: { $size: '$comments' }

                }
            }
        ])


В итоге получаю массив owner с двумя полями, но мне нужно избавиться от массива и оставить только объект. Я понимаю что через $group можно все это прогнать, но можно ли без $group обойтись в данном случае?
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы