TL;DR: Here’s a quick example to query MongoDB documents created this year(2023) and group them by date, ie. how many my_doc were created today, yesterday, the day before yesterday, etc. The following statement works in a MongoDB client such as mongosh.
db.my_doc.aggregate([
{
$match: {
created_at: { $gte: ISODate("2023-01-01")}
}
},
{
$group: {
_id: {
$dateToString: {
format: "%Y-%m-%d",
date: "$created_at"
}
},
count: { $sum: 1 }
}
},
{
$sort: {_id: 1}
}
])Then here’s an equivalent example to do it with MongoEngine in Python:
def histogram(days=7):
from_date = datetime.datetime.today() - datetime.timedelta(days=days)
pipeline = [
{
"$match": { "created_at": { "$gte": from_date}}
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$created_at" }},
"count": { "$sum": 1 }
}
},
{
"$sort": { "_id": 1 }
}
]
for row in MyDoc.objects.aggregate(pipeline):
print(row)Since I just started learning MongoDB, I guess this probably is not the most efficient way to do group-by in MongDB. I’ll see if there’s a better way.
