Estoy creando una aplicación de citas, donde el uso tiene opciones de filtro de género (masculino, femenino, cualquiera). Cuando el usuario selecciona any , no quiero filtrar ningún campo de gender . Solo quiero filtrar/hacer coincidir el campo de gender cuando el usuario selecciona opciones male o female .
const matching_users = await User .aggregate([{ $match: { $and: [{ uid: { $in: matches } }, { account_setuped: true }, { $or: [{ gender: settings.gender_filter === "any" ? "male" : settings.gender_filter }, { gender: settings.gender_filter === "any" ? "female" : settings.gender_filter }] } ] } }, ])¿Hay alguna opción mejor que esta?
Para la parte de comparación de género, creo que se puede simplificar como:
.aggregate([{ $match: { $and: [ { // Filter 1 }, { // Filter 2 }, { $expr: { $or: [ { $eq: [ "any", settings.gender_filter ] }, { $eq: [ "$gender", settings.gender_filter ] } ] } } } ] } }]Ejemplo de parque infantil de Mongo
Otro enfoque con switch
{ "$switch": { "branches": [ { "case": { $eq: [ "any", settings.gender_filter ] }, "then": true }, ], default: { $eq: [ "$gender", settings.gender_filter ] } } } Ejemplo de zona de juegos de Mongo ( $switch )
Nota: Para probar la demostración, reemplace el valor que contiene el comentario:
// configuración.género_filtro