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

Как произвести слияние коллекций и получением только первой записи в массиве?

Возможно ли реализовать все так?
Есть две коллекции
Первая: Collections
var schema = new Schema({
    name: { type: String },
    owner: { type: mongoose.Schema.Types.ObjectId, ref: 'Users' }, // владелец
    photos: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Photos' }],
    public: { type: Number, default: 1 },
    createdAt: { type: Date, default: Date.now }
})

Вторая: Photos
var schema = new Schema({
	createdAt: 			{ type: Date,		default: Date.now },
	owner: 				{ type: mongoose.Schema.Types.ObjectId, ref: 'Users', required: !0 },
        image: 				{ type: String, 	required: !0 },
	domain: 			        { type: String, 	default: config.domain.photos },
});

Что там, что там owner Users._id

Мне нужно получить все данные пользователя из Collections, для этого я делаю следующее:
Collections.aggregate([
        { $match: { owner: request.owner } },
        { $sort: { createdAt: -1 } },
        { $lookup: { from: 'photos', localField: 'photos', foreignField: '_id', as: 'photos' } },
        {
            $project: {
                _id: { $toString: "$_id" },
                name: 1,
                photos: {
                    "$map": { 
                        input: "$photos",
                        as: "p",
                        in: { $concat: ['$$p.domain', 'folder/', '$$p.image'] } }
                }
            }
        }
    ])

И на выходе получаю правильный объект
{
    name: 'Папка',
    _id: '5d557777ab6666e77777e',
    photos: [
      'https://site/folder/img.jpg',
      'https://site/folder/img2.jpg''
    ]
  }

Но поле photos содержит кучу записей, а мне нужно всего лишь одну, чтобы было так
{
    name: 'Папка',
    _id: '5d557777ab6666e77777e',
    photos: 'https://site/folder/img.jpg',
  }

Или чтобы photos был массивом с одним элементом.
  • Вопрос задан
  • 32 просмотра
Решения вопроса 1
ms-dred
@ms-dred Автор вопроса
Вечно что то не то и что то не так...
Сам допехал
photos: {
 $arrayElemAt: [{
  "$map": { 
   input: "$photos",
   as: "p",
   in: { $concat: ['$$p.domain', 'folder/', '$$p.image'] } }
  }, 0 ]
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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