MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :Comment compter un champ si sa valeur correspond à une condition ?

Utilisez le pipeline d'agrégation suivant :

db.click_log.aggregate([
    { "$match" : { "log.type" : { "$ne" : "emailed" } } }, // get rid of docs with an "emailed" value in log.type and docs not from this month
    { "$unwind" : "$log" }, // unwind to get log elements as separate docs
    { "$project" : { "_id" : 1, "log" : 1, "month" : { "$month" : "$log.utc_timestamp" } } },
    { "$match" : { "log" : "clicked", "month" : <# of month> } }, // get rid of log elements not from this month and that aren't type clicked
    { "$group" : { "_id" : "$_id", "count" : { "$sum" : 1 } } } // collect clicked elements from same original doc and count number
])

Cela renverra, pour chaque document n'ayant pas "envoyé par e-mail", une valeur de log.type , le nombre d'éléments du tableau log qui ont log.type valeur clicked et avec l'horodatage du mois en cours. Si vous souhaitez une période de 30 jours glissants pour le mois, modifiez le $match être une requête de plage avec $gt et $lt couvrant la période souhaitée.