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

如何在mongosh中使用regex通过db.collection.find()查询文档?

在mongosh中使用正则表达式查询文档的正确方法

问题背景

2025年4月2日,我搜索“如何在mongosh中使用regex查询文档?”时没有得到任何结果(0 results),于是决定整理这个问题和我找到的解决方案。

作为MongoDB和mongosh(MongoDB Shell)的新手,我需要删除误插入的部分数组文档,只知道它们的_id部分编号。但mongosh终端不允许粘贴ID,为了避免手动输入24位的_id字符串,我花了数小时查找如何用regex查询_id,却找不到任何针对mongosh的相关内容。

我试过找到的语法db.users.find({ "_id": { $regex: /[regex-pattern]/} }),但在mongosh里完全无效;db.collection.findId()也不能直接在mongosh中使用。常规的db.collection.find()的regex语法,同样无法用来查询_id——这让我一度困惑,因为之前的回答里甚至没人提到mongosh这个术语。

后来我才搞清楚:默认情况下,无法在mongosh中用正则表达式直接查询_id,因为_id是ObjectId类型,而非字符串,正则只能匹配字符串类型的字段。最后我只能手动输入完整的24位_id,用db.collection.delete( {_id: ObjectId("...")} )命令删除了目标文档。

下面分享mongosh中使用正则表达式的正确语法,以及针对_id的替代方案。

mongosh中针对字符串字段的正则查询语法

针对集合中的字符串类型字段,mongosh支持两种常用的正则写法:

1. 正则字面量写法

适合简单的匹配场景,写法简洁:

// 匹配name字段中包含"john"的文档,添加i选项表示不区分大小写
db.users.find({ name: /john/i })

2. $regex操作符写法

适合需要动态生成正则、或需要指定多个匹配选项的场景:

// 匹配email字段以"@example.com"结尾的文档,不区分大小写
db.users.find({ email: { $regex: /@example.com$/, $options: "i" } })

// 也可以用字符串形式定义正则(注意转义特殊字符)
db.users.find({ email: { $regex: "@example.com$", $options: "i" } })

$options支持的参数:

  • i:不区分大小写
  • m:多行匹配
  • x:忽略空白字符
  • s:允许.匹配换行符

针对_id的查询/删除方案

因为_id默认是ObjectId类型,无法直接用正则匹配,这里提供两种替代方案:

1. 转换_id为字符串后匹配(聚合方式)

通过聚合操作将_id转为字符串,再用正则匹配,适合少量数据的场景:

// 匹配_id转换为字符串后包含"abc123"的文档
db.users.aggregate([
  { $addFields: { idStr: { $toString: "$_id" } } },
  { $match: { idStr: /abc123/ } }
])

注意:这种方法需要遍历整个集合,数据量大时性能较差,尽量避免使用。

2. 已知完整_id时的删除写法

如果能拿到完整的_id字符串,必须将其转为ObjectId类型才能正确匹配:

// 删除单个匹配的文档
db.collection.deleteOne({ _id: ObjectId("60d21b4667d0d8992e610c85") })

// 删除多个匹配的文档
db.collection.deleteMany({ 
  _id: { 
    $in: [ObjectId("60d21b4667d0d8992e610c85"), ObjectId("60d21b4867d0d8992e610c86")] 
  } 
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:43:24