
本文介绍如何通过 mgo 包在 go 中构造 mongodb 正则匹配查询,模拟 sql 中的 `like` 行为,重点讲解 `bson.regex` 的正确用法及常见误区。
在 MongoDB 中,原生不支持 SQL 风格的 LIKE 语法,但可通过正则表达式(regex)实现等效功能,例如匹配以 "org" 开头的 permalink 字段(类似 WHERE permalink LIKE 'org%')。使用已归档但仍在广泛使用的 mgo 包时,*不能直接将字符串如 `"org."` 作为查询值传入**——这会被当作精确字符串匹配,而非正则表达式。
正确做法是使用 bson.RegEx 类型显式构造正则对象。其定义为:
type RegEx struct {
Pattern string
Options string // 如 "i"(忽略大小写)、"m"(多行模式)等,可为空
}✅ 正确示例(匹配以 "org" 开头的 permalink):
var m []Organisation // 假设 Organisation 是你的结构体
err := sess.DB(db).C(cApp).
Find(bson.M{"permalink": bson.RegEx{"org.*", ""}}).
All(&m)
if err != nil {
log.Fatal(err)
}⚠️ 注意事项:
- Pattern 字段需为标准 Go 正则语法(MongoDB 使用 PCRE 兼容引擎,但 mgo 会将其透传,因此 .*、^、$ 等均有效);
- 若需忽略大小写,可设置 Options: "i",例如 bson.RegEx{"org.*", "i"};
- 不要写成 bson.M{"permalink": "/org.*/"} 或 "org:bms.*" —— 这些只是普通字符串,MongoDB 不会解析为正则;
- mgo 已不再维护(官方推荐迁移到 mongo-go-driver),新项目应优先考虑现代驱动;若必须使用 mgo,请确保引入的是 gopkg.in/mgo.v2。
? 小技巧:如需实现 LIKE '%org%'(包含子串),可使用 bson.RegEx{"org", ""};如需 LIKE 'org%'(前缀匹配),推荐 bson.RegEx{"^org", ""},语义更清晰且性能更优(MongoDB 可利用索引前缀加速)。
总结:bson.RegEx{Pattern, Options} 是 mgo 中实现模糊匹配的唯一可靠方式。掌握其结构与使用边界,可安全替代 SQL 的 LIKE,同时兼顾表达力与可维护性。










