Ja. Du kan använda Datumoperatörer med $substr och $concat att knyta ihop allt.
db.test.aggregate([
{"$group": {
"_id" : { "$concat": [
{"$substr": [{"$year": "$date"}, 0, 4 ]},
"-",
{"$substr": [{"$month": "$date"}, 0, 2 ]},
"-",
{"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]},
]},
"count": {"$sum": 1 }
}},
{"$sort": { "_id": 1 }}
])
Du kan bara använda datumoperatorerna och skapa ett dokument som i:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Det fungerar lika bra. Men detta ger dig ett fint snöre. Detta utnyttjar det faktum att $substr
kommer att kasta från heltal till sträng. Om det någonsin läggs till i dokumentationen.
Titta på Datumoperatörer dokumentation för användning på andra tidsindelningar som kan användas på datum.
Ännu bättre, använd date math för att returnera ett BSON-datum:
import datetime
db.test.aggregate([
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
{ "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
{ "$mod": [
{ "$subtract": [ "$date", datetime.datetime.utcfromtimestamp(0) ] },
1000 * 60 * 60 * 24
]}
]},
datetime.datetime.utcfromtimestamp(0)
]
},
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
])
Här datetime.datetime.utcfromtimestamp(0)
kommer att matas in i pipelinen som ett BSON-datum som representerar "epok". När du $subtract
ett BSON-datum från ett annat, skillnaden i millisekunder returneras. Detta gör att du kan "runda" datumet till den aktuella dagen genom att återigen subtrahera $mod
resultat för att få resten av millisekunders skillnad från en dag.
Detsamma gäller för $add
där att "lägga till" ett BSON-datum till ett numeriskt värde kommer att resultera i ett BSON-datum.