javascript - 使用 mongodb 进行搜索查询使用 $or 返回一个结果

标签 javascript regex express mongoose

我正在尝试使用 javascript 查询我的 MongoDB,但当我应该使用 $or 时,我似乎得到了一个结果。

我打算从前端接收一个字符串。我的逻辑是用空格分割字符串,并搜索该字符串是否与数据库中的任何技能、位置和名称匹配。例如,如果用户搜索 PHP,则即使用户拥有其他技能,它也应该将所有具有 PHP 技能的用户带入。下面是代码

数据

{
    "_id":"1",
    "skills": ["PHP"],
    "name":"You"
}
{
    "_id":"2",
    "skills": ["PHP", "Javascript"],
    "name":"Me"
}

代码

exports.search = async (req, res, next) => {
  try {
    const escapeChar = escapeString(req.body.query);
    const searchQueries = escapeChar.split(' ');
    let result;
    for (let i in searchQueries) {
      const ret = async () => {
        const pattern = new RegExp(searchQueries[i], 'gi');
        const user = await User.find({
          $or: [{ name: pattern }, { skills: pattern }],
        });
        return user;
      };
      result = await ret();
    }
    if (result.length > 0) {
      return res.json(sendResponse(httpStatus.OK, 'User found', result));
    }
    return res.json(sendResponse(httpStatus.NOT_FOUND, 'User not found'));
  } catch (error) {
      next(error);
  }  
};

假设我搜索 PHP,我应该获得两个用户。这有效。

但是如果我用“PHP me”搜索,我会得到

{
    "_id":"2",
    "skills ["PHP", "Javascript"],
    "name":"Me"
}

而不是两个用户,因为两者的技能数组中都有 php 。请问这可能是什么问题以及如何解决这个问题。

最佳答案

为什么不在查询中使用 $regex

db.getCollection('tests').find({
    $or: [{
        name: {
            $regex: /Me$/
        }
    }, {
        skills: {
            $regex: /PHP$/
        }
    }]
});

以上查询将为您提供所需的结果。

关于javascript - 使用 mongodb 进行搜索查询使用 $or 返回一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525882/

相关文章:

javascript - 如何设置 ionic2 的选定 ng

javascript - 如何禁用点击按钮?

regexp_replace 就像我给它一个全局标志一样,但我没有

c++ - 如何修复重叠的 XML?

node.js - 如果有人在 Node js 应用程序中通过 multer 将扩展名从 exe 更改为 png,则不应允许文件上传

javascript - 如何使用 Javascript 创建具有特定自定义数据属性的 div 数组

javascript - 安装 npm 本地包依赖

java - 替换字符串中的数字

javascript - Express:实现 MongoDB session 存储

javascript - Express 无法获取/图像