如何在mongosh中使用regex通过db.collection.find()查询文档?
问题背景
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

