Comment obtenir des données Mongo en utilisant l’agrégat MongoDB

Supposons que nous ayons 10 collections, alors nous devons trouver le nombre sur la base de tag_id . Par exemple, si tag_id contient 0 et 1, nous devons alors compter toutes les données, ainsi que les données qui n’ont pas tag_id ou dont tag_id est null. Ensuite, si non lu: faux, la sortie arrive, compte de tous les non lus.

Trouvez les nombres de tag_id et les nombres de non-lus quand faux.

  { "_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" ] } 

résultat attendu:

 { "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 }] } 

Vous pouvez utiliser le pipeline d’agrégation ci-dessous.

La requête ci-dessous va $unwind le tag_id suivi de $group pour compter le email et $cond opérateur $cond pour compter le unread électronique unread .

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