Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

640
Vistas
Agregado de MongoDB: agrupar por mes en un campo con marca de tiempo (int)

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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' } } } ]
over 4 years ago · Santiago Trujillo Denunciar

0

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]} ] } } } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda