【问题标题】:Mongoose find with or operator failing猫鼬发现或操作员失败
【发布时间】:2019-08-28 05:46:28
【问题描述】:

我有一个自动完成输入,我想通过_idnameemail 查找用户。

此查询运行良好,但它只使用姓名或电子邮件进行搜索:

  var matchRegexp = new RegExp(_.escapeRegExp(req.query.match), 'i');

  User.find(
    {$or: [{email: matchRegexp}, {name: matchRegexp}]},
    {email: 1, name: 1, _id: 0}
    ).limit(limitResults).exec(
    function(error, users) {
      if (error) {
        return res.status(400).json({
          "message": "Query failed",
        });
      } else {
        return res.json({
          "results": users
        });
      }
    }
  );

如果我尝试在$or 添加_id,则无法通过nameemail 进行搜索,但它适用于_id

{$or: [{email: matchRegexp}, {name: matchRegexp}, {_id: req.query.match}]}

如何使用所有 3 个选项让它工作?

编辑:

这是错误:

CastError: 路径“_id”处的值“ayeye”转换为 ObjectId 失败 模型“用户”

根本没有考虑姓名和电子邮件...

【问题讨论】:

  • 对我来说它的工作。您能否出示一些条件不合格的文件
  • @AnthonyWinzlet 感谢您的调试...对我来说,它触发了我刚刚发布的错误。
  • stackoverflow.com/a/25798043/6322587 应该会有所帮助!

标签: node.js mongodb mongoose


【解决方案1】:

因为您的匹配字符串不是有效的ObjectId,您会收到此错误。

所以在这里您可以先检查验证是否有效ObjectId,然后相应地制定标准。

const ObjectId = require('mongoose').Types.ObjectId

const criteria = { $or: [{ email: matchRegexp },{ name: matchRegexp }] }

If (ObjectId.isValid(matchRegexp)) {
  criteria.$or.push({ _id: matchRegexp })
}

User.find(criteria, { email: 1, name: 1, _id: 0 }).limit(limitResults).exec()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2017-01-16
    • 2019-12-03
    • 2021-10-25
    • 2016-02-14
    • 2017-10-17
    • 2023-03-29
    相关资源
    最近更新 更多