MongoServerError:$regex表达式未识别,MongoDB查询合并条件报错求助
解决MongoDB查询中的
Unrecognized expression '$regex'错误 错误根源
- 重复键覆盖问题:你在
find的查询对象里定义了两个$expr,JavaScript对象中重复键会被最后一个值覆盖,直接导致第一个条件完全失效。 $expr使用场景错误:$expr是用于聚合表达式(比如$eq、$gt这类聚合操作符)的上下文,而$regex属于查询过滤器的操作符,不能嵌套在$expr内部使用。
正确查询写法
你需要将两个条件通过$and组合(表示需同时满足两组$or条件),同时把$regex相关条件直接放在查询层级,无需嵌套$expr:
const expenses = await db .collection("expenses") .find({ $and: [ // 第一组OR条件:匹配用户关联字段或买家字段 { $or: [ { "users.username": user.username }, { buyer: user.username } ] }, // 第二组OR条件:匹配描述、买家、分类的正则 { $or: [ { description: { $regex: req.query.q } }, { buyer: { $regex: req.query.q } }, { category: { $regex: req.query.q } } ] } ] })
可选优化
- 若需要忽略大小写匹配,可给正则添加
$options: "i"参数:
{ description: { $regex: req.query.q, $options: "i" } }
- 当查询对象中多个条件为并列关系时,可省略
$and直接写两组$or(MongoDB会默认视为$and关系),但显式使用$and会让代码可读性更强:
const expenses = await db .collection("expenses") .find({ $or: [ { "users.username": user.username }, { buyer: user.username } ], $or: [ { description: { $regex: req.query.q } }, { buyer: { $regex: req.query.q } }, { category: { $regex: req.query.q } } ] })
内容的提问来源于stack exchange,提问作者Eminent Emperor Penguin
相关产品推荐
相关产品推荐

