MongoDB的模糊查询
模糊查询时数据库应用中不可缺少的一步,MySQL中使用like
和或者regexp
来实现实现模糊查询,而MongoDB则使用$regex
操作符或直接使用正则表达式对象来实现。
MySQL |
MongoDB |
select * from users where name like ’%gooohlan%’ |
db.users.find({name: {$regex: /gooohlan/}}) |
select * from users where name regexp ’gooohlan’ |
db.users.find({name: /gooohlan/}) |
更多相关的语法可查看官方文档:$regex,就不再做多讨论。
使用MongoDB GO Driver进行查询
先来看看我们的数据源:
1 2 3 4 5 6 7
| db.users.find({}) { "_id" : ObjectId("600704fffc9b483f284d0bc3"), "name" : "1gooohlan" } { "_id" : ObjectId("600704fffc9b483f284d0bc4"), "name" : "gooohlanPP" } { "_id" : ObjectId("600704fffc9b483f284d0bc5"), "name" : "gooohlan" } { "_id" : ObjectId("600704fffc9b483f284d0bc6"), "name" : "gooohlan123" } { "_id" : ObjectId("600704fffc9b483f284d0bc7"), "name" : "abcdef" } { "_id" : ObjectId("60070500fc9b483f284d0bc8"), "name" : "test" }
|
然后执行模糊查询:
1 2 3 4 5
| db.users.find({name:{$regex: /gooohlan/,$options: "i"}}) { "_id" : ObjectId("600704fffc9b483f284d0bc3"), "name" : "1gooohlan" } { "_id" : ObjectId("600704fffc9b483f284d0bc4"), "name" : "gooohlanPP" } { "_id" : ObjectId("600704fffc9b483f284d0bc5"), "name" : "gooohlan" } { "_id" : ObjectId("600704fffc9b483f284d0bc6"), "name" : "gooohlan123" }
|
错误尝试
上述方式是MongoDB的命令行的执行方式,如果我们直接在Go里面直接这样写是行不通的
1 2 3 4 5 6
| filter := bson.M{ "name": bson.M{ "$regex": "/gooohlan/", "$options": "i", }, }
|
当你兴高采烈地拿着上面的查询条件去查询时,你会发现它会返回一个空数组给你
正确的使用方式
1 2 3 4 5 6
| filter := bson.M{ "name": primitive.Regex{ Pattern:"/gooohlan/", Options: "i", }, }
|
执行后发现还是没有,一番查找后才发现Pattern
不再额外需要两个/
,直接填写正则内容即可,所以我们改为:
1 2 3 4 5 6
| filter := bson.M{ "name": primitive.Regex{ Pattern:"gooohlan", Options: "i", }, }
|
执行结果为:
1 2 3 4
| {ID:ObjectID("600704fffc9b483f284d0bc3") Name:1gooohlan} {ID:ObjectID("600704fffc9b483f284d0bc4") Name:gooohlanPP} {ID:ObjectID("600704fffc9b483f284d0bc5") Name:gooohlan} {ID:ObjectID("600704fffc9b483f284d0bc6") Name:gooohlan123}
|
与命令行查找的一致,说明没有问题