поиск и объединение вложенных массивов - PullRequest
0 голосов
/ 11 октября 2018

У меня есть две коллекции, которые я хочу объединить с совокупностью.Первый - «книги»

{
    "_id": "56e31ce076cdf52e541d9d28",
    "title": "Good Omens",
    "author": [
        { 
             "_id": "56e31ce076cdf50ssdksi998j",
             "function": "Writer"
        },
        {
             "_id": "56e31ce076cdf52e541d9d29",
             "function": "Illustrator"
        }
    ]
}

Второй - «авторы»

{
    "_id": "56e31ce076cdf50ssdksi998j",
    "name": "Terry Pratchett"
}
{
    "_id": "56e31ce076cdf52e541d9d29",
    "name": "Neil Gaiman"
}

Результат, который я ожидаю, таков:

{
    "_id": "56e31ce076cdf52e541d9d28",
    "title": "Good Omens",
    "author": [
        { 
             "_id": "56e31ce076cdf50ssdksi998j",
             "function": "Writer",
             "name": "Terry Pratchett"
        },
        {
             "_id": "56e31ce076cdf52e541d9d29",
             "function": "Illustrator",
             "name": "Neil Gaiman"
        }
    ]
}

Но яне в состоянии объединить оба массива.Подход, который я пробовал до сих пор, использует совокупный запрос с поиском и проектом, но он не объединяет массивы.Если я сделаю это:

Books.aggregate([
    {
        $lookup: {
            from: 'authors',
            localField: 'author._id',
            foreignField: '_id',
            as: 'authors'
        }
    }
    {
        $project: {
            title: 1,
            'authors._id': 1,
            'authors.name': 1,
            'authors.function': '$author.function'
        } 
    }
])
.exec(...)

Я получу что-то вроде этого:

{
    "_id": "56e31ce076cdf52e541d9d28",
    "title": "Good Omens",
    "author": [
        { 
             "_id": "56e31ce076cdf50ssdksi998j",
             "function": ["Writer", "Illustrator"],
             "name": "Terry Pratchett"
        },
        {
             "_id": "56e31ce076cdf52e541d9d29",
             "function": ["Writer", "Illustrator"],
             "name": "Neil Gaiman"
        }
    ]
}

Но я не хочу получать все данные по каждому автору, только по соответствующей позиции.Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Вы можете использовать ниже агрегации.

Books.aggregate([
  {"$unwind":"$author"},
  {"$lookup":{
    "from":"authors",
    "localField":"author._id",
    "foreignField":"_id",
    "as":"author.name"
  }},
  {"$addFields":{"author.name":{"$arrayElemAt":["$author.name",0]}}},
  {"$group":{
    "_id":"$_id",
    "title":{"$first":"$title"},
    "author":{"$push":"$author"}
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...