I have a MongoDb table documents with country, month and delivery partner name columns,
They look something like this -
[{
"id": "1",
"month": "Jan",
"deliveryPartner": {
"name": "Lalamove"
},
"country": "ID"
},
{
"id": "2",
"month": "Jan",
"deliveryPartner": {
"name": "Lalamove"
},
"country": "ID"
},
{
"id": "3",
"month": "Jan",
"deliveryPartner": {
"name": "Borzo"
},
"country": "ID"
},
{
"id": "4",
"month": "Jan",
"deliveryPartner": {
"name": "Lalamove"
},
"country": "PH"
},
{
"id": "5",
"month": "Jan",
"deliveryPartner": {
"name": "Borzo"
},
"country": "PH"
},
{
"id": "6",
"month": "Feb",
"deliveryPartner": {
"name": "Borzo"
},
"country": "ID"
},
{
"id": "7",
"month": "Feb",
"deliveryPartner": {
"name": "Borzo"
},
"country": "ID"
},
{
"id": "8",
"month": "Feb",
"deliveryPartner": {
"name": "Lalamove"
},
"country": "PH"
}
]
I want to write an aggregate query that will give me an output like this -
[
{
"deliveryPartner": "Lalamove",
"country": "ID",
"month": [
{
"Jan": 2
},
{
"Feb": 0
}
]
},
{
"deliveryPartner": "Borzo",
"country": "ID",
"month": [
{
"Jan": 1
},
{
"Feb": 2
}
]
},
{
"deliveryPartner": "Lalamove",
"country": "PH",
"month": [
{
"Jan": 1
},
{
"Feb": 1
}
]
},
{
"deliveryPartner": "Borzo",
"country": "PH",
"month": [
{
"Jan": 1
},
{
"Feb": 0
}
]
}
]
I tried the following query but, the output is not coming as expected -
let result = await con.aggregate([
{ $match : { year : "2023", "deliveryPartner.name": { $ne: null }, "country": { $ne: null }, "month": { $ne: null } } },
{
$group: {
_id: {
deliveryPartner: "$deliveryPartner.name",
country: "$country",
month: "$month"
},
count: { $sum: 1 }
}
},
{
$group: {
_id: {
deliveryPartner: "$_id.deliveryPartner",
country: "$_id.country"
},
monthData: {
$push: {
month: "$_id.month",
count: "$count"
}
}
}
}
]).toArray();
console.log("result => ", JSON.stringify(result));
The output does not set the missing month count to 0