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
}
]
}
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:
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:
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!