Shekhar Tyagi Shekhar Tyagi - 7 months ago 31
Javascript Question

How to get data Mongo data using aggregate MongoDB

Suppose we have 10 collection, then we have to find the count on the basis of

tag_id
. For example, if
tag_id
contains 0 and 1, then we have to count all the data, as well as counting the data that don't have
tag_id
, or where
tag_id
is null. Then if it has unread : false then the output comes, count of all the unread.

Find the counts of tag_id and counts of unread when false.

{
"_id": ObjectId("5912c7240520df77f0c2c18a"),
"email_id": "54",
"unread": "false",
"__v": NumberLong(0),
"tag_id": ["0"

]
}, {
"_id": ObjectId("5912c71e0520df77f0c2c189"),
"email_id": "55",
"unread": "false",
"__v": NumberLong(0),
"tag_id": [
"1"
]
}, {
"_id": ObjectId("5912c71d0520df77f0c2c186"),
"email_id": "51",
"unread": "false",
"__v": NumberLong(0),
"tag_id": [
"2", "1"
]
}


expected result:

{
"data": [{
"tag_id": "1",
"count_email": 1,(count of email on the basis of tag_id)
"unread": 9(count the unread on the basis of output of tag_id)
}, {
"tag_id": "3",
"count_email": 45,
"unread": 3
}, {
"tag_id": "2",
"count_email": 5,
"unread": 4
}, {
"id": null,
"count_email": 52,
"unread": 35
}]
}

Answer Source

You can use below aggregation pipeline.

The below query will $unwind the tag_id followed by $group to count email and $cond operator to count the unread email.

db.collection.aggregate(
 {$unwind:"$tag_id"}, 
 {$group:{
    _id:"$tag_id", 
     count_email:{$sum:1},
     unread:{$sum:{$cond:[{$eq:["$unread", "false"]}, 0, 1]}}
    }
  }
);