Ja. Du kan bruge datooperatørerne med $substr og $concat at binde det hele sammen.
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 kun bruge datooperatorerne og lave et dokument som i:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Det fungerer lige så godt. Men dette giver dig en fin snor. Dette gør brug af det faktum, at $substr
vil kaste fra heltal til streng. Hvis det nogensinde bliver tilføjet til dokumentationen.
Se på datooperatørerne dokumentation til brug på de øvrige tidsinddelinger, der kan bruges på datoer.
Endnu bedre, brug date math til at returnere en BSON-dato:
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 } }
])
Her datetime.datetime.utcfromtimestamp(0)
vil blive ført ind i pipelinen som en BSON-dato, der repræsenterer "epoke". Når du $subtract
en BSON-dato fra en anden forskellen i millisekunder returneres. Dette giver dig mulighed for at "runde" datoen til den aktuelle dag ved igen at trække $mod
resultat for at få resten af millisekunders forskel fra en dag.
Det samme gælder for $add
hvor "tilføjelse" af en BSON-dato til en numerisk værdi vil resultere i en BSON-dato.