mongodb $ lookup отдельное поле в под-документе массива - PullRequest
0 голосов
/ 23 марта 2020

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

db.posts.insert([
   { "_id" : 1, "name" : "post 1"  },
   { "_id" : 2, "name" : "post 2"  },
   { "_id" : 3, "name" : "post with related", related: [{tagline: 'read post1', post: 1}, {tagline: 'more in post2', post: 2}]  }
])

Теперь я хочу получить сообщения и "расширить" поле "related.post" с помощью $lookup И сохранить поле tagline, я пробовал что-то подобное, но не повезло ...

db.posts.aggregate([
    {$lookup: {
        from: 'posts',
        localField: 'related.post',
        foreignField: '_id',
        as: 'related.post'
    }}
])

Есть ли (простой) способ достичь этого? Thx!

1 Ответ

0 голосов
/ 08 апреля 2020

эта стратегия будет работать

db.posts.aggregate([
    {$lookup: {
        from: 'posts',
        localField: 'related.post',
        foreignField: '_id',
        as: 'posts'
    }},
    {$unwind: {
        path: '$related',
        preserveNullAndEmptyArrays: true
    }},
    {$addFields: {
        'related.post': {
            $filter: {
                input: '$posts',
                as: 'posts',
                cond: { $eq: ['$related.post', '$$posts._id'] }
            }
        }
    }},
    {$addFields: {
        'related.post': {$arrayElemAt: ['$related.post', 0]}
    }},
    {$group: {
        _id: '$_id',
        name: { $first: '$name' },
        related: { '$push': '$related' }
    }},
])
...