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.