I am making a dating app, where use have gender filter options (male, female, any). When user selects any I dont want to filter any gender field. I only want to filter/match gender field when user selects male or female options.
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
}]
}
]
}
}, ])
is there any better options other than this?
For the gender comparison part, I think can be simplified as:
.aggregate([{
$match: {
$and: [
{
// Filter 1
},
{
// Filter 2
},
{
$expr: {
$or: [
{
$eq: [
"any",
settings.gender_filter
]
},
{
$eq: [
"$gender",
settings.gender_filter
]
}
]
}
}
}
]
}
}]
Another approach with switch
{
"$switch": {
"branches": [
{
"case": {
$eq: [
"any",
settings.gender_filter
]
},
"then": true
},
],
default: {
$eq: [
"$gender",
settings.gender_filter
]
}
}
}
Sample Mongo Playground ($switch)
Note: To test the demo, replace the value which contains the comment:
// settings.gender_filter