javascript 使用req.query查找所有对象LIKE字符串

3qpi33ja  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(97)

我有以下代码,用于对Mongoose数据库的API调用的GET路由,我想使用查询字符串来查找包含各种单词的所有项目,示例路径如下:
/cpu=i3&username=bob
这应该会导致所有人的CPU都包含i3,名字中包含bob(一个奇怪的例子!).
CPU可以是任何一代的,实际上包含以下内容:
英特尔(R)酷睿(TM)i3- 8109 U CPU@3.00GHz或英特尔(R)酷睿(TM)i3-3220 CPU@3.30GHz
名字可以是鲍勃史密斯,鲍勃琼斯,鲍勃你明白的想法!
我可以这样使用正则表达式:

const foundAsset = await Asset.find({'cpu': {'$regex': '.*i3.*'}});

对我来说,问题是,显然我不能硬编码cpu或i3,因为它可以是任何东西,例如,它可能只是搜索username=bob而不是cpu=i3,我阅读的查询字符串如下:

.get(async (req, res) => {
  let options = {
    ...req.query
  };

然后像这样返回:

const foundAsset = await Asset.find(options);

    res.json({
      status: 'success',
      data: foundAsset
    });
  } catch (e) {
    console.log(e);
  }

显然,在正则表达式中将Options替换为i3是有意义的,但显然不起作用,因为options具有{ cpu:'i3' },我当然可以放一些类似options.cpu的东西,它只会返回CPU,但是如果有人想搜索像bob这样的用户名,我该怎么办呢?
我确实知道每个查询字符串可能是什么,因此可以循环遍历每个查询字符串?
谢谢

eh57zj3b

eh57zj3b1#

你的想法没有错,opitons对象,你只需要转换查询数据,使用mongo正则表达式运算符。
所以你的代码应该是这样的:

cosnt options= Object.keys(req.query).reduce(
  (accumulator, key) => {
     accumulator[key] = {'$regex': `.*${req.query[key]}.*`}
     return accumulator;
  },{})
const foundAsset = await Asset.find(options);

相关问题