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
$unwind - Deconstruct zipcodes array to multiple documents.
$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.
$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
}
}
])