如何将请求查询转换为正确的MongoDB查询字符串?
我得到的请求(req.query)的格式如下:如何将请求查询转换为正确的MongoDB查询字符串?,mongodb,express,Mongodb,Express,我得到的请求(req.query)的格式如下: { duration: { gte: '5' }, difficulty: 'easy' } 要使其在MongoDB中工作,最终结果如下 { duration: { $gte: 5 }, difficulty: 'easy' } 这是我正在使用的代码 const queryObj = { ...req.query }; let queryStr = JSON.stringify(queryObj); queryStr = queryStr.re
{ duration: { gte: '5' }, difficulty: 'easy' }
要使其在MongoDB中工作,最终结果如下
{ duration: { $gte: 5 }, difficulty: 'easy' }
这是我正在使用的代码
const queryObj = { ...req.query };
let queryStr = JSON.stringify(queryObj);
queryStr = queryStr.replace(/\b(gte|lte|gt|lt)\b/g, (match) => `$${match}`);
但是,输出是{duration:{'$gte':'5'},难度:'easy'}
所以它不起作用
{ duration: { $gte: 5 }, difficulty: 'easy' } : return every matched records
{ duration: { '$gte': '5' }, difficulty: 'easy' }: return 0 record.
我的问题是:如何删除“”符号以便将其用于查询字符串?正则表达式方法无法转换数字,因为
regex
约束您继续使用string
。您必须迭代整个对象并检查每个键
下面是一个非常简单的递归函数,可以实现这一点:
let finalObject = { duration: { gte: '5' }, difficulty: 'easy' }
function recursivelySearchObject(object) {
if (typeof object === "string") {
if (/^\d+$/.test(object)) {
return parseInt(object)
} else {
return object
}
} else {
Object.keys(object).forEach((key) => {
object[key] = recursivelySearchObject(object[key]);
});
return object
}
}
recursivelySearchObject(finalObject);
如果对象总是“浅”的,您可以跳过递归方面,而只需使用for循环检查到某个深度即可。谢谢,它成功了!顺便说一句,我仍然不明白为什么带“”的查询字符串不起作用。这是预期的吗?我不确定您所说的
查询字符串是什么意思,但Mongo希望$gte
有一个数字。它不会验证和清理输入。我用更多的信息编辑了我的问题。基本上,我在Mongo DB Atlas筛选器中尝试了两个不同的查询字符串。因此问题再次出现在5
中,Mongo可以在没有“
或”
只要不使用点表示法,它们周围都有,但正如我提到的$gte
在这种情况下需要一个数字。否则将尝试比较字符串,而您的字段不是string
类型。啊,我明白了!!谢谢你,汤姆。