I am new to mongoDB. Tried a lot of things but none worked. I have documents with fields as shown below(and many other fields, posting just relevant ones).
| APP OWNER | TECHNOLOGY | ENVIRONMENT |
|---|---|---|
| appowner1 | Neptune | PROD |
| appowner2 | RDS | NONPROD |
| appowner3 | DynamoDB | PROD |
| appowner4 | Redshift | NONPROD |
| appowner5 | Migration | PROD |
| appowner6 | DocumentDB | NONPROD |
| appowner7 | Elastic | PROD |
| appowner8 | Neptune | NONPROD |
| appowner9 | RDS | PROD |
| appowner10 | DynamoDB | NONPROD |
| appowner11 | Redshift | PROD |
| appowner12 | Migration | NONPROD |
| appowner13 | DocumentDB | PROD |
| appowner14 | Elastic | NONPROD |
How to write a mongoDB aggregate query to get the following output?
| TECHNOLOGY | PROD | NON PROD | TOTAL |
|---|---|---|---|
| Neptune | 2 | 2 | 4 |
| RDS | 2 | 2 | 4 |
| DynamoDB | 2 | 2 | 4 |
| Redshift | 2 | 2 | 4 |
| Migration | 2 | 2 | 4 |
| DocumentDB | 2 | 2 | 4 |
| Elastic | 2 | 2 | 4 |
CodePudding user response:
You can try this:
db.collection.aggregate([
{
"$group": {
"_id": "$technology",
"PROD": {
"$sum": {
"$cond": {
"if": {
"$eq": [
"$environment",
"PROD"
]
},
"then": 1,
"else": 0
}
}
},
"NONPROD": {
"$sum": {
"$cond": {
"if": {
"$eq": [
"$environment",
"NONPROD"
]
},
"then": 1,
"else": 0
}
}
},
"TOTAL": {
"$sum": 1
}
}
},
{
"$project": {
"_id": 0,
"technology": "$_id",
"TOTAL": 1,
"PROD": 1,
"NONPROD": 1
}
}
])
Here, we group by technology field and calculate the PROD, NONPROD and TOTAL values. Here's the playground link.
Or as suggested in the comments by nimrod serok. You can try this, cleaner way:
db.collection.aggregate([
{
"$group": {
"_id": "$technology",
"PROD": {
"$sum": {
"$cond": {
"if": {
"$eq": [
"$environment",
"PROD"
]
},
"then": 1,
"else": 0
}
}
},
"TOTAL": {
"$sum": 1
}
}
},
{
"$project": {
"_id": 0,
"technology": "$_id",
"TOTAL": 1,
"PROD": 1,
"NONPROD": {
"$subtract": [
"$TOTAL",
"$PROD"
]
}
}
}
])
Playground link.
