sql >> Base de Datos >  >> NoSQL >> MongoDB

grupo de pymongo por fecha y hora

Sí. Puede usar los operadores de fecha con $substr y $concat para unirlo todo.

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

Podría usar solo los operadores de fecha y hacer un documento como en:

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

Eso funciona igual de bien. Pero esto te da una buena cadena. Esto hace uso del hecho de que $substr se convertirá de entero a cadena. Si eso alguna vez se agrega a la documentación.

Mire los Operadores de fecha documentación para uso en las otras divisiones de tiempo que se pueden usar en fechas.

Mejor aún, use las matemáticas de fecha para devolver una fecha 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 } }
])

Aquí datetime.datetime.utcfromtimestamp(0) se introducirá en la canalización como una fecha BSON que representa "época". Cuando $subtract una fecha BSON de otra se devuelve la diferencia en milisegundos. Esto le permite "redondear" la fecha al día actual restando nuevamente el $mod resultado para obtener el resto de la diferencia de milisegundos de un día.

Lo mismo ocurre con $add donde "agregar" una fecha BSON a un valor numérico dará como resultado una fecha BSON.