TAk. Możesz użyć operatorów daty z $substr i $concat powiązać to wszystko razem.
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 }}
])
Możesz użyć tylko operatorów daty i utworzyć dokument, jak w:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
To działa równie dobrze. Ale to daje niezły ciąg. Wykorzystuje to fakt, że $substr
będzie rzutować z liczby całkowitej na łańcuch. Jeśli kiedykolwiek zostanie dodany do dokumentacji.
Spójrz na Operatory daty dokumentacja do wykorzystania w innych przedziałach czasowych, które mogą być używane w datach.
Jeszcze lepiej, użyj matematyki dat, aby zwrócić datę BSON:
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 } }
])
Tutaj datetime.datetime.utcfromtimestamp(0)
zostanie wprowadzony do rurociągu jako Data BSON reprezentująca „epokę”. Gdy $subtract
jedna data BSON od drugiej zwracana jest różnica w milisekundach. Pozwala to na „zaokrąglenie” daty do bieżącego dnia przez ponowne odjęcie $mod
wynik, aby uzyskać resztę milisekund różnicy z dnia.
To samo dotyczy $add
gdzie „dodanie” daty BSON do wartości liczbowej spowoduje powstanie daty BSON.