如何将请求查询转换为正确的MongoDB查询字符串?

如何将请求查询转换为正确的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

我得到的请求(req.query)的格式如下:

{ 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
类型。啊,我明白了!!谢谢你,汤姆。