Ja. U kunt de Date Operators gebruiken met $substr en $concat om het allemaal samen te binden.
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 }}
])
U kunt alleen de datumoperators gebruiken en een document maken zoals in:
"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Dat werkt net zo goed. Maar dit geeft je een mooie string. Dit maakt gebruik van het feit dat $substr
zal casten van integer naar string. Als dat ooit aan de documentatie wordt toegevoegd.
Kijk naar de Datumoperators documentatie voor gebruik op de andere tijdsindelingen die op datums kunnen worden gebruikt.
Beter nog, gebruik datumberekening om een BSON-datum te retourneren:
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 } }
])
Hier datetime.datetime.utcfromtimestamp(0)
zal in de pijplijn worden ingevoerd als een BSON-datum die "tijdperk" vertegenwoordigt. Wanneer u $subtract
de ene BSON-datum van de andere het verschil in milliseconden wordt geretourneerd. Hiermee kunt u de datum "afronden" naar de huidige dag door opnieuw de $mod
resultaat om de resterende milliseconden verschil van een dag te krijgen.
Hetzelfde geldt voor $add
waarbij het "toevoegen" van een BSON-datum aan een numerieke waarde resulteert in een BSON-datum.