MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Pymongo-Gruppe nach Datetime

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.