'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]
$unwind- Deconstructzipcodesarray to multiple documents.$lookup- Joinshopswithcustomerscollection.2.1.
$match-shops'zipcodeis withinaddress.zipcodefromcustomers.2.2.
$project- Decorate the output documents forcustomersarray.$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
}
}
])
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 |
