No puedo agregar una colección con agrupación por mes en el campo con valor como marca de tiempo.
Collection(Dummy): { "created_at": 1232341243 }, {...}, ...Ahora, si quiero agregar los documentos de esta colección en un mes usando $month arroja el siguiente error:
db.getCollection('dummy').aggregate([{"$group": {"_id": {"$month": "$created_at"}}}]) Error message "errmsg" : "can't convert from BSON type int to Date",Versión de MongoDB: 3.6.3
Primero puede convertir la marca de tiempo "created_at" a la fecha usando la etapa "addFields",
{ $addFields: { convertedDate: {"$toDate":"$created_at"} } }después de eso, puede hacer más operaciones. Entonces, finalmente, su consulta de agregación será algo así como, para la versión 3.6
[ { '$project': { "convertedDate": { "$add": [ new Date(0), "$created_at" ] } } }, { '$project': { 'month': { '$month': '$convertedDate' }, 'year': { '$year': '$convertedDate' } } }, { '$group': { '_id': { 'month': '$month', 'year': '$year' }, 'total': { '$sum': 1 }, 'month': { '$first': '$month' }, 'year': { '$first': '$year' } } } ]Para la versión 4+
[ { '$addFields': { 'convertedDate': {"$toDate":"$created_at"} } }, { '$project': { 'month': { '$month': '$convertedDate' }, 'year': { '$year': '$convertedDate' } } }, { '$group': { '_id': { 'month': '$month', 'year': '$year' }, 'total': { '$sum': 1 }, 'month': { '$first': '$month' }, 'year': { '$first': '$year' } } } ]Comencemos por ver qué tipos de entrada admite $month :
Una fecha, una marca de tiempo o un ID de objeto.
Entonces, para la versión 4.0+ de Mongo, puede usar $toDate para convertir un (número) ts válido o una cadena de fecha válida en un objeto de Date de la siguiente manera:
{"$group": {"_id": {"$month": {"$toDate":"$created_at"}}}}Como está usando una versión anterior de Mongo y no tiene acceso a esta función, puede usar una agregación "pirata" usando $add , ya que cuando obtiene un número y un tipo de fecha, devolverá un tipo de fecha.
La única advertencia es que deberá convertir su marca de tiempo (que se representa con segundos desde la época 0) a milisegundos. es decir, multiplicar por 1000, así:
from datetime import datetime ... { "$group": { "_id": { "$month": { '$add': [ datetime(1970, 1, 1), {'$multiply': ["$created_at", 1000]} ] } } } }