Tengo una variedad de cadenas como esta
let fromHour = ['2.5','3','3.5'] let toHour = ['2.5','3','3.5']Tengo una matriz de objetos guardados en mongoDB
timeRange = [ { from:'2.5', to:'3' }, { from:'3', to:'3.5' } ]Quiero verificar si alguno de mi conjunto de valores de cadena existe en ese valor de objeto
He intentado esto pero me da este error (Expresión no reconocida '$match')
checkAppoint = await Appointment.aggregate([ { $project: { date: myScheduleFinal[k].date, status: { $in: ['pending', 'on-going'] }, timeRange: { '$match': { 'from': { $in: fromHolder }, 'to': { $in: toHolder }, }, }, }, }, ]);también he probado esta solución y funciona para mí, pero lleva mucho tiempo, así que estoy probando esto con agregado
checkAppoint = await Appointment.findOne({ date: myScheduleFinal[k].date, status: { $in: ['pending', 'on-going'] }, timeRange:{$elemMatch:{ from:{$in:fromHolder}, to:{$in:toHolder} }} });Así que alguien tiene una solución para eso
Simplemente pruebe $elemMatch y $in ,
find() checkAppoint = await Appointment.find({ timeRange: { $elemMatch: { from: { $in: fromHour }, to: { $in: toHour } } } })aggregate() checkAppoint = await Appointment.aggregate([ { $match: { timeRange: { $elemMatch: { from: { $in: fromHour }, to: { $in: toHour } } } } } ])Así que encontré una forma de resolver este problema y compartiré la solución que usé.
Primero, quiero minimizar mi solicitud a mongodb, por lo que ahora estoy haciendo solo una solicitud que traiga todas las citas con la fecha requerida y quiero hacerlo de esta manera porque mi matriz fromHour y toHour cambiará muchas veces a través de una sola solicitud.
helperArray => contiene todo el día que quiero verificar su rango
let checkAppoint = await Appointment.find({ date: { $in: helperArray }, status: { $in: ['pending', 'on-going'] }, });ahora dentro de mi ciclo for revisaré esos datos
checkAppoint.filter((singleAppoint) => { if (singleAppoint._doc.date === myScheduleFinal[k].date) { singleAppoint._doc.timeRange.map((singleTime) => { if (fromHolder.includes(singleTime.from)) { busy = true; } }); } });