MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

gruppo pymongo per datetime

Sì. Puoi utilizzare gli Operatori di data con $substr e $concat per legare tutto insieme.

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

Potresti usare solo gli operatori di data e creare un documento come in:

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

Funziona altrettanto bene. Ma questo ti dà una bella corda. Questo fa uso del fatto che $substr eseguirà il cast da intero a stringa. Se mai verrà aggiunto alla documentazione.

Guarda gli Operatori di data documentazione per l'utilizzo sulle altre divisioni temporali che possono essere utilizzate nelle date.

Meglio ancora, usa la matematica delle date per restituire una data 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 } }
])

Qui datetime.datetime.utcfromtimestamp(0) verrà inserito nella pipeline come una data BSON che rappresenta "epoca". Quando $subtract un BSON Data da un altro viene restituita la differenza in millisecondi. Ciò consente di "arrotondare" la data al giorno corrente sottraendo nuovamente $mod risultato per ottenere i restanti millisecondi di differenza rispetto a un giorno.

Lo stesso vale per $add dove "aggiungendo" una data BSON a un valore numerico risulterà in una data BSON.