You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mongoose中通过正则表达式搜索ObjectId?

解决Mongoose中用正则匹配ObjectId类型_id的问题

这个坑我之前踩过!你遇到501错误的核心原因是:MongoDB的_id字段是ObjectId类型,不是普通字符串,直接用$regex去匹配会因为类型不兼容导致数据库无法执行查询。

下面给你两种实用的解决方法:

方法一:用$expr+$regexMatch(推荐,MongoDB 4.2+支持)

利用MongoDB的聚合表达式,先把ObjectId转换为字符串,再执行正则匹配:

Object.find({
  $expr: {
    $regexMatch: {
      input: { $toString: "$_id" }, // 将ObjectId转为字符串
      regex: "00d0",
      options: "i" // 忽略大小写
    }
  }
})

如果只是想匹配末尾的00d0,可以把正则改成/00d0$/i,这样能避免误匹配到中间包含该字符串的ObjectId:

Object.find({
  $expr: {
    $regexMatch: {
      input: { $toString: "$_id" },
      regex: /00d0$/i,
      options: "i"
    }
  }
})

方法二:预存_id字符串(适合高频查询场景)

如果你的业务经常需要这类模糊匹配查询,上面的方法会因为无法使用_id的索引导致性能下降(数据量越大越明显)。建议在文档中新增一个字符串类型的字段,比如idStr,存储_id的字符串形式:

// 新增文档时同步存储idStr
const doc = new Object({
  // 其他字段...
  idStr: this._id.toString()
});
await doc.save();

// 查询时直接匹配idStr,还能给idStr建索引提升性能
Object.find({ idStr: { $regex: /00d0$/i } })

注意事项

  • 方法一的查询会遍历所有文档转换ObjectId,数据量大时性能较差,仅适合小数据集或偶尔查询的场景;
  • 方法二虽然需要额外存储字段,但能利用索引大幅提升查询效率,是长期高频查询的最优解。

内容的提问来源于stack exchange,提问作者thousight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:16