'find customers in zip code using mongodb aggrigation

I have 2 mongodb documents shop and customer

shop documents are like below

{
 id: 1,
 zipcodes:[ 
  '12345',
  '11111',
 ]
}

{
 id:2,
 zipcodes:[
  '45678',
 ]
}

customer documents are like below

{
 id:20,
 name: 'First Last',
 address: [
  {
   id:110,
   address: 'address line1',
   zipcode: '12345',
  },
  {
   id:111,
   address: 'address new',
   zipcode: '45678',
  }
 ]
},
{
 id:25,
 name: 'First Last2',
 address: [
  {
   id:113,
   address: 'address new',
   zipcode: '45678',
  },
 ]
},
{
 id:29,
 name: 'First Name',
 address: [
  {
   id:119,
   address: 'address liner',
   zipcode: '11111',
  },
  {
   id:120,
   address: 'address new2',
   zipcode: '12345',
  }
 ]
},

expected output. I need to get customers in same zip code

[
 {
  zipcode: 12345,
  customers:[
   {id:20},
   {id:29},
  ]
 },
 {
  zipcode: 11111,
  customers:[
   {id:29},
  ]
 },
 {
  zipcode: 45678,
  customers:[
   {id:25},
  ]
 },
]

I tried to solve this using mongodb aggregation framework but no luck so far. I have no idea how to match object elements in a array. thanks in advance. please help.

edited- added expected output



Solution 1:[1]

  1. $unwind - Deconstruct zipcodes array to multiple documents.

  2. $lookup - Join shops with customers collection.

    2.1. $match - shops' zipcode is within address.zipcode from customers.

    2.2. $project - Decorate the output documents for customers array.

  3. $project - Decorate the output documents.

db.shops.aggregate([
  {
    $unwind: "$zipcodes"
  },
  {
    $lookup: {
      from: "customers",
      let: {
        zipcodes: "$zipcodes"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              "$in": [
                "$$zipcodes",
                "$address.zipcode"
              ]
            }
          }
        },
        {
          $project: {
            _id: 0,
            id: 1
          }
        }
      ],
      as: "customers"
    }
  },
  {
    $project: {
      _id: 0,
      zipcodes: 1,
      customers: 1
    }
  }
])

Sample Mongo Playground

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yong Shun