Quiero obtener registros que existen en la matriz de fechas proporcionada.
Esta matriz de fechas proporcionada obtendrá registros entre la fecha de inicio y finalización.
Ejemplo:
tengo este esquema:
[ { "_id": "1", "course": "Maths", "startDate": "2022-06-07", "endDate": "2022-06-12" }, { "_id": "2", "course": "Chemistry", "startDate": "2022-06-06", "endDate": "2022-06-09" }, { "_id": "3", "course": "Physics", "startDate": "2022-06-08", "endDate": "2022-06-10" }, { "_id": "4", "course": "Computer Science", "startDate": "2022-06-10", "endDate": "2022-06-18" }, { "_id": "5", "course": "Computer Science", "startDate": "2022-06-10", "endDate": "2022-06-13" }, { "_id": "6", "course": "Biology", "startDate": "2022-06-08", "endDate": "2022-06-10" } ]Matriz proporcionada:
["2022-06-06", "2022-06-17"]La respuesta esperada es:
[ { "_id": "2", "course": "Chemistry", "startDate": "2022-06-06", "endDate": "2022-06-09" }, { "_id": "4", "course": "Computer Science", "startDate": "2022-06-10", "endDate": "2022-06-18" } ]¿Alguien puede ayudarme con la consulta? Gracias
Puede usar una canalización de agregación con $filter :
matchingDates que cuente los elementos en la matriz de dates que coincidan con la condición.$match solo con documentos que tengan dichos elementos. db.collection.aggregate([ {$addFields: {dates: ["2022-06-06", "2022-06-17"]}}, { $set: { matchingDates: { $size: { $filter: { input: "$dates", as: "item", cond: { $and: [ {$gte: [{$toDate: "$$item"}, {$toDate: "$startDate"}]}, {$lte: [{$toDate: "$$item"}, {$toDate: "$endDate"}]} ] } } } } } }, {$match: {matchingDates: {$gt: 0}}}, {$unset: ["dates", "matchingDates"]} ])