MongoDB的模糊查询操作(类关系型数据库的 like 和 not like)
2019-07-19 18:57
1581 查看
1.作用与语法描述
作用: 正则表达式是使用指定字符串来描述、匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。
语法一
{ <field>: { $regex: /pattern/, $options: '<options>' } } { <field>: { $regex: 'pattern', $options: '<options>' } } { <field>: { $regex: /pattern/<options> } }
语法二
{ <field>: /pattern/<options> }
2.案例演示
假设MongoDB中存放了我们OrderService服务的消息信息,其数据如下:
(以下为演示所用到的9个文档)
{ "_id" : ObjectId("5d305b1c4857fc49c0c14c81"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b3b4857fc49c0c14c82"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b404857fc49c0c14c83"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b454857fc49c0c14c84"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b4b4857fc49c0c14c85"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b4f4857fc49c0c14c86"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305bb74857fc49c0c14c87"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"shenzheng\\\" origincode=\\\"QQ0003\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305bd14857fc49c0c14c88"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0002\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305be94857fc49c0c14c89"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0001\\\" /></Body></Response>\"" }
需求: 查询 data 字段 含有 字符 <Head>OK</Head>的文档
执行代码如下:
db.dbtestregex.find({data:{ $regex:/<Head>OK<\/Head>/}})
查询代码中的 \ 为转移符,以下查询语句也是如此。
返回结果如下:
{ "_id" : ObjectId("5d305bb74857fc49c0c14c87"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"shenzheng\\\" origincode=\\\"QQ0003\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305bd14857fc49c0c14c88"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0002\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305be94857fc49c0c14c89"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0001\\\" /></Body></Response>\"" }
上面的查询命令也可以改写成:
db.dbtestregex.find({data:/<Head>OK<\/Head>/})
其查询结果是一样的,如下:
{ "_id" : ObjectId("5d305bb74857fc49c0c14c87"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"shenzheng\\\" origincode=\\\"QQ0003\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305bd14857fc49c0c14c88"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0002\\\" /></Body></Response>\"" }, { "_id" : ObjectId("5d305be94857fc49c0c14c89"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>OK</Head><Body><OrderResponse filter_mmm=\\\"2\\\" destcity=\\\"zhongshan\\\" origincode=\\\"QQ0001\\\" /></Body></Response>\"" }
还可以写成:
db.dbtestregex.find({data:{ $regex:'<Head>OK<\/Head>'}})
其实现功能一样。
3.类关系型数据库中的 not like 功能实现
反向查询虽然不常见,但也是我们DBA必须的。下面我们做一个案例演示,看看在MongoDB中,怎么实现not like 功能的查询。
需求 查询data 字段中不含 <Head>OK</Head>的文档
执行脚本如下:
db.dbtestregex.find({data:{ $not: /<Head>OK<\/Head>/ }})
返回的文档如下;
{ "_id" : ObjectId("5d305b1c4857fc49c0c14c81"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b3b4857fc49c0c14c82"), "order" : "QQ00001", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b404857fc49c0c14c83"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b454857fc49c0c14c84"), "order" : "QQ00002", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b4b4857fc49c0c14c85"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }, { "_id" : ObjectId("5d305b4f4857fc49c0c14c86"), "order" : "QQ00003", "data" : "\"<?xml version='1.0' encoding='UTF-8'?><Response service=\\\"OrderService\\\"><Head>ERR</Head><ERROR>重复下单</ERROR></Response>\"" }
更多内容可参照官方文档 https://docs.mongodb.com/manual/reference/operator/query/regex/#op._S_regex
相关文章推荐
- thinkphp怎么like模糊查询数据库的信息curd操作
- MongoDB 数据库操作(三)-高级查询
- MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测
- mongodb查询语句及mongoose操作数据库总结
- Java操作mongodb的模糊查询和精确查询
- 数据库-Oracle【SQL模糊查询语句(like) 及SQL Server 2005 导入和导出向导】
- mongodb 实现关系型数据库中查询某一列 的效果
- MongoDB中类似模糊查询操作
- mysql(DQL操作)查询(条件查询,模糊查询等)数据库-命令行
- 数据库学习 - like(模糊查询)
- 数据库-Oracle【SQL模糊查询语句(like) 及SQL Server 2005 导入和导出向导】
- java操作mongodb模糊查询
- mongotemplate mongodb的各种操作 模糊查询 精确查询 等等
- MySQL_1 关系型数据库的存储结构 数据库的添加,修改,删除,查询操作 数据库表的添加,修改,删除,查询操作 数据库表记录的添加,修改,删除,查询
- myBatis 操作 mysql时,使用 like 关键进行模糊查询的方法
- mongodb 实现关系型数据库中查询某一列 的效果
- java 中 mongodb的各种操作 模糊查询 精确查询 等等
- MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测
- MongoDB(2)shell命令操作数据库 2查询
- MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测