Brug følgende aggregeringspipeline:
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
])
Dette vil returnere, for hvert dokument, der ikke har "mailet" som værdien log.type
, antallet af elementer i arrayet log
der har log.type
værdi clicked
og med tidsstempel fra den aktuelle måned. Hvis du ønsker en glidende 30-dages periode for måned, skal du ændre $match
at være en intervalforespørgsel med $gt
og $lt
dækker det ønskede tidsrum.