Ano. Můžete použít Operátory data s $substr a $concat abychom to všechno spojili.
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 }}
])
Můžete použít pouze operátory data a vytvořit dokument jako v:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
To funguje stejně dobře. Ale tohle vám dává pěknou strunu. To využívá skutečnosti, že $substr
přetypuje z celého čísla na řetězec. Pokud to někdy bude přidáno do dokumentace.
Podívejte se na Date Operators dokumentaci pro použití na jiných časových děleních, která lze použít v datech.
Ještě lépe, použijte matematickou matematiku pro vrácení BSON Date:
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 } }
])
Zde datetime.datetime.utcfromtimestamp(0)
bude přiváděno do potrubí jako datum BSON představující „epochu“. Když $subtract
jeden BSON Date od druhého je vrácen rozdíl v milisekundách. To vám umožní „zaokrouhlit“ datum na aktuální den opětovným odečtením $mod
výsledek, abyste získali zbývající milisekundový rozdíl oproti dni.
Totéž platí pro $add
kde "přidáním" data BSON k číselné hodnotě bude výsledkem datum BSON.