numericFilters=price>30,rating<4.5
So in Express:
numericFilters === "price>30,rating<4.5"
if (numericFilters) {
const operatorMap = {
'>': '$gt',
'>=': '$gte',
'=': '$eq',
'<': '$lt',
'<=': '$lte',
};
const regEx = /\b(<|>|<=|>=|=)\b/g;
let filters = numericFilters.replace(
regEx,
(match) => `-${operatorMap[match]}-`
);
const options = ['price', 'rating'];
filters.split(',').forEach((item) => {
const [field, operator, value] = item.split('-');
if (options.includes(field)) {
queryObject[field] = { [operator]: Number(value) };
}
});
}✔ numericFilters exists
✔ Value = "price>30,rating<4.5"
➡ Code enters the block
const operatorMap = {
'>': '$gt',
'>=': '$gte',
'=': '$eq',
'<': '$lt',
'<=': '$lte',
};📦 Memory now contains:
operatorMap['>'] → '$gt'
operatorMap['<'] → '$lt'
➡ This is your translator dictionary
const regEx = /\b(<|>|<=|>=|=)\b/g;This regex finds comparison operators inside strings.
In:
price>30,rating<4.5
It finds:
><
let filters = numericFilters.replace(
regEx,
(match) => `-${operatorMap[match]}-`
);Original string:
price>30,rating<4.5
>→-$gt-<→-$lt-
Final result:
filters === "price-$gt-30,rating-$lt-4.5"
🔥 THIS IS THE KEY TRANSFORMATION
const options = ['price', 'rating'];✔ Only safe fields allowed
✔ Prevents invalid or malicious queries
filters.split(',')Result:
[
"price-$gt-30",
"rating-$lt-4.5"
]item = "price-$gt-30"Split:
["price", "$gt", "30"]Destructuring:
field = "price"
operator = "$gt"
value = "30"
MongoDB query built:
queryObject.price = { $gt: 30 };item = "rating-$lt-4.5"Split:
["rating", "$lt", "4.5"]MongoDB query built:
queryObject.rating = { $lt: 4.5 };queryObject = {
price: { $gt: 30 },
rating: { $lt: 4.5 }
}Product.find({
price: { $gt: 30 },
rating: { $lt: 4.5 }
});Give me products where:
- price is greater than 30
- AND rating is less than 4.5