This is what my documents look like
{
code: "A2df",
clicks: 7,
countries: [{"country":"IN", clicks:5},{"country":"US", clicks:2}],
domains: [{"domain":"a.com", clicks:4},{"country":"b.com", clicks:3}]
},
{
code: "B3ws",
clicks: 11,
countries: [{"country":"IN", clicks:6},{"country":"ND", clicks:5}],
domains: [{"domain":"a.com", clicks:7},{"country":"c.com", clicks:4}]
},
{
code: "A2df",
clicks: 5,
countries: [{"country":"IN", clicks:2},{"country":"ND", clicks:3}],
domains: [{"domain":"a.com", clicks:1},{"country":"c.com", clicks:4}]
}...
This is what I need:
{
code: "A2df",
clicks: 12,
countries: [
{
"country": "IN",
clicks: 7
},
{
"country": "US",
clicks: 2
},
{
"country": "ND",
clicks: 3
}
],
domains: [
{
"domain": "a.com",
clicks: 5
},
{
"country": "b.com",
clicks: 3
},
{
"country": "c.com",
clicks: 4
}
]
}
I know how to do this in multiple queries. I can do a group aggregation and sum for clicks, unwind the arrays and then group them and then sum them. But I want to skip the pain of making three requests to the database and then of merging the three results.
Is there a way in MongoDB all of this can be done in a single query. I can't change the structure of the documents. Any help is appreciated. Even if this can't be done in a single query, any suggestions are appreciated to reduce the pain. :)
This is what I have tried so far to get it work in a single query:
[
{
$match: {
date: {
$gte: fromDate,
$lt: toDate
},
brand_id: brandId,
type: "item"
}
},
{
$unwind: "$countries"
},
{
$group: {
_id: {
code: "$code",
},
clicks: {
$sum: "$countries.clicks"
},
countries: {
$push: "$countries"
}
}
},
{
$unwind: "$domains"
},
{
$group: {
_id: {
code: "$code",
},
clicks: {
$sum: "$domains.clicks"
},
domains: {
$push: "$domains"
}
}
}
]
This returns an empty array, but if I just do the first unwind and group it gives me the required output for countries. So that's what I am trying to solve, try and get everything in one query.
domainsinformation as you group on(code, country), which spans differentdomainsvalues. Use multiple aggregations. Also, make your data model sensible by counting all clicks on the appropriatecodedocument, instead of having it split between multiple for no apparent reason - that's the root of the problem.