es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo ‘no se puede restar una fecha de una cadena’ en la agregación de MongoDB.

He escrito este código de MongoDB para obtener la diferencia entre la fecha de inicio y la fecha de finalización del jefe del empleado, pero estoy obteniendo un error:

No se puede restar una fecha de una cadena

Aquí está mi código:

db.department.aggregate([
  {
    $lookup: {
      from: 'employees',
      localField: 'dept_id',
      foreignField: 'dept_id',
      as: 'employees_list'
    }
  },
  {
    $set: {
      employees: {
        $objectToArray: '$employees_list'
      }
    }
  },
  {
    $set: {
      Dt_diff: {
        $map: {
          input: '$employees',
          as: 'b',
          'in': {
            k: '$$b.k',
            v: {
              $divide: [
                {
                  $subtract: ['$$b.v.start_dt', '$$b.v.end_dt']
                },
                86400000
              ]
            }
          }
        }
      }
    }
  },
  {
    $match: {
      'Dt_diff.v': {
        $elemMatch: {
          $gt: 14
        }
      }
    }
  }
])

Estoy usando Compass para crear esta agregación y obtengo una salida correcta, y puedo obtener la diferencia entre las dos fechas hasta la etapa 3 de $set, pero cuando uso el operador $match, aparece el error anterior.

¿Alguien tiene alguna sugerencia?

Aquí está mi documento:

{
  _id: ObjectId("6188a5283543f7cc2f77c73f"),
  dept_id: 1,
  emp_list: {
    '0': {
      start_dt: 2021-08-15T06:00:00.000Z,
      emp_head: 'ID000067',
      end_dt: 2021-08-25T06:00:00.000Z
    }
  },
  employees_list: [
    {
      _id: ObjectId("6147925cb38887fa243c2389"),
      empId: ['ID000067','ID000090','ID000012','ID000065','ID000047']
    }
  ],
  employees: [
    {
      k: '0',
      v: {
        start_dt: 2021-08-15T06:00:00.000Z,
        emp_head: 'ID000067',
        end_dt: 2021-08-25T06:00:00.000Z
      }
    }
  ],
  Dt_diff: [
    {
      k: '0',
      v: 10
    }
  ]
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error que estás recibiendo: “no se puede restar una fecha de una cadena”, sugiere que uno (o ambos) de los campos que están siendo restados usando el operador $subtract es una cadena en lugar de una fecha.

    Al observar tu documento, los campos start_dt y end_dt parecen ser objetos ISODate (que son un tipo de fecha), pero es posible que estén siendo convertidos a cadenas en algún punto del pipeline.

    Para solucionar esto, puedes agregar un operador $type para verificar el tipo de los campos start_dt y end_dt, de la siguiente manera:

    {$project: {
      start_dt_type: {$type: "$employees.start_dt"},
      end_dt_type: {$type: "$employees.end_dt"}
    }}
    

    Esto mostrará el tipo de los campos start_dt y end_dt para cada objeto de empleado en el arreglo employees.

    Si descubres que los campos de fecha están siendo convertidos a cadenas en algún punto del pipeline, puedes utilizar el operador $toDate para convertirlos de vuelta a fechas antes de realizar la resta:

    {$subtract: [
      {$toDate: "$$b.v.start_dt"},
      {$toDate: "$$b.v.end_dt"}
    ]}
    

    Ten en cuenta que el operador $toDate está disponible únicamente en MongoDB versión 4.0 y superior. Si estás usando una versión anterior, es posible que necesites utilizar el operador $dateFromString en su lugar.

    ¡Espero que esto te ayude!

Comments are closed.