MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

groupe pymongo par datetime

Oui. Vous pouvez utiliser les Opérateurs de date avec $substr et $concat pour lier le tout.

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 }}
])

Vous pouvez utiliser uniquement les opérateurs de date et créer un document comme dans :

"day": { 
    "year": {"$year": "$date" },
   "month": {"$month": "$date"}, 
   "day": {"$dayOfYear": "$date"}
}

Cela fonctionne aussi bien. Mais cela vous donne une belle chaîne. Cela utilise le fait que $substr convertira d'entier en chaîne. Si jamais cela est ajouté à la documentation.

Regardez les Opérateurs de date documentation à utiliser sur les autres divisions horaires pouvant être utilisées sur les dates.

Mieux encore, utilisez les calculs de date pour renvoyer une date 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 } }
])

Ici datetime.datetime.utcfromtimestamp(0) sera introduit dans le pipeline en tant que date BSON représentant "l'époque". Lorsque vous $subtract une date BSON d'une autre, la différence en millisecondes est renvoyée. Cela vous permet "d'arrondir" la date au jour actuel en soustrayant à nouveau le $mod résultat pour obtenir le reste de millisecondes de différence par rapport à un jour.

Il en va de même pour $add où "ajouter" une date BSON à une valeur numérique donnera une date BSON.