Tengo un problema con la consulta de agregación de Mongoose. Tengo el siguiente esquema que es una matriz de objetos y contiene el valor endDate .
[ { "id": 1, "endDate": "2022-02-28T19:00:00.000Z" }, { "id": 2, "endDate": "2022-02-24T19:00:00.000Z" }, { "id": 3, "endDate": "2022-02-25T19:00:00.000Z" } ] Por lo tanto, durante el resultado de la agregación, tengo que agregar un nuevo nombre de campo isPast , contiene el valor booleano y realizar el cálculo para verificar si la fecha de endDate se pasó o no. Si ya se aprobó, isPast será true ; de lo contrario, será false .
Estoy usando la función isBefore de la biblioteca de momentos que devuelve el valor booleano. Pero dentro de esta función se enfrenta a un problema con respecto a pasar el valor de fecha de endDate . $endDate se transmite como una cadena, no como un valor.
¿Hay alguna forma de pasar el valor de endDate dentro de la función?
const todayDate = moment(new Date()).format("YYYY-MM-DD"); db.collection.aggregate([ { $addFields: { "isPast": moment('$endDate', 'YYYY-MM-DD').isBefore(todayDate) }, }, ])Puedes lograrlo sin momentjs. Use $toDate para convertir la cadena de fecha y hora a la fecha
db.collection.aggregate([ { $addFields: { "isPast": { $gt: [ new Date(), { $toDate: "$endDate" } ] } } } ])Ejemplo de parque infantil de Mongo
Si solo desea comparar solo por fecha:
db.collection.aggregate([ { $set: { "currentDate": "$$NOW", "endDate": { $toDate: "$endDate" } } }, { $addFields: { "isPast": { $gt: [ { "$dateFromParts": { "year": { $year: "$currentDate" }, "month": { $month: "$currentDate" }, "day": { "$dayOfMonth": "$currentDate" } } }, { "$dateFromParts": { "year": { $year: "$endDate" }, "month": { $month: "$endDate" }, "day": { "$dayOfMonth": "$endDate" } } } ] } } } ])