Ja. Sie können die Datumsoperatoren verwenden mit $substr und $concat um alles zusammen zu 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 }}
])
Sie könnten nur die Datumsoperatoren verwenden und ein Dokument wie in:
erstellen"day": {
"year": {"$year": "$date" },
"month": {"$month": "$date"},
"day": {"$dayOfYear": "$date"}
}
Das funktioniert genauso gut. Aber das gibt Ihnen eine schöne Saite. Dies macht sich die Tatsache zunutze, dass $substr
wird von einer Ganzzahl in eine Zeichenfolge umgewandelt. Falls das jemals zur Dokumentation hinzugefügt wird.
Sehen Sie sich die Datumsoperatoren an Dokumentation für die Verwendung in anderen Zeiteinheiten, die an Datumsangaben verwendet werden können.
Besser noch, verwenden Sie Datumsmathematik, um ein BSON-Datum zurückzugeben:
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)
wird in die Pipeline als BSON-Datum eingespeist, das "Epoche" darstellt. Wenn Sie $subtract
ein BSON-Datum von einem anderen wird die Differenz in Millisekunden zurückgegeben. Auf diese Weise können Sie das Datum auf den aktuellen Tag "runden", indem Sie erneut die $mod
Ergebnis, um den Rest der Differenz von Millisekunden von einem Tag zu erhalten.
Dasselbe gilt für $add
wobei das "Hinzufügen" eines BSON-Datums zu einem numerischen Wert zu einem BSON-Datum führt.