0

I have a problem with how to make lookup inside array with mongodb aggregation.

For example, i have a user data json like this:

{
   "_id": "1234",
   "name": "Tony",
   "language": [
       {
           "_id": "111",
           "language_id": "919",
           "level": "Expert"
       }
       {
           "_id": "111",
           "language_id": "920",
           "level": "Basic"
       }
   ]
} 

And my language collection:

{
   "_id": "919",
   "name": "English"
},
{
   "_id": "920",
   "name": "Chinese"
}

And i want make mongodb aggregation which is result like this:

{
   "_id": "1234",
   "name": "Tony",
   "language": [
       {
           "name": "English",
           "level": "Expert"
       }
       {
           "name": "Chinese",
           "level": "Basic"
       }
   ]
} 

Thanks before.

ASHafizullah
  • 603
  • 1
  • 9
  • 22

1 Answers1

1
  • $unwind deconstruct language array
  • $lookup with language collection
  • $arrayElemAt to select specific index element from return result from language
  • $group by _id and reconstruct language array
db.user.aggregate([
  { $unwind: "$language" },
  {
    $lookup: {
      from: "language",
      localField: "language.language_id",
      foreignField: "_id",
      as: "language.name"
    }
  },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      language: {
        $push: {
          name: { $arrayElemAt: ["$language.name.name", 0] },
          level: "$language.level"
        }
      }
    }
  }
])

Playground

turivishal
  • 34,368
  • 7
  • 36
  • 59