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

MongoDB的模糊查询操作(类关系型数据库的 like 和 not like)的更多相关文章

  1. python数据库-mongoDB的高级查询操作(55)

    一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...

  2. mybatis框架入门程序:演示通过mybatis实现数据库的模糊查询操作

    1. mybatis的基本准备操作见我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2. 根据用户名查询用户信息: (1)映射文件 ...

  3. MongoDB如何设置权限(类似关系型数据库的用户名和密码)

    MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限.这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 Mongo ...

  4. IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)

    1>什么是CoreData Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数 ...

  5. .netcore mongodb 分页+模糊查询+多条件查询

    .netcore MongoDB.Driver 版本才2.8 与aspnet差距太大,网上找很多资料没有现成的代码. public override async Task<PagerList&l ...

  6. Mongodb 级联删除查询操作

    ObjRelationPojo表一条记录 public class YpObjRelationPojo implements Serializable { @Id private String id; ...

  7. 在DAO的查询操作里,数据库查询到记录,sql语句也成功执行,但是返回的对象是null

     在这里  如果改成User user=null; 后面 对user对象的赋值是会失败的. 原因: 要赋值的话,一定要有对象,要new一下给对象分配空间然后再给对象赋值.

  8. MongoDB非关系型数据库开发手册

    一:NoSql数据库 什么是NoSQL? NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL用于超 ...

  9. NoSql非关系型数据库之MongoDB应用(三):MongoDB在项目中的初步应用

    业精于勤,荒于嬉:行成于思,毁于随. 我们可以结合相关的IDE做一个简单的增删改查了,实现MongoDB在项目中的初步应用. 前提是安装了MongoDB服务和MongoDB可视化工具,没有安装的可以点 ...

随机推荐

  1. JavaWeb 实现简单登录、注册功能

    1.首先创建一个简单的动态Javaweb项目 2.然后手动建立文件目录: 项目创建好之后,在src下建几个包: controller:控制器,负责转发请求,对请求进行处理,主要存放servlet: d ...

  2. strcmp函数和memcmp函数的用法区别及联系

    前言: C语言中有很多东西容易搞混,最近笔者就遇到了一个问题.这里做个记录.就是memcmp和strcmp两者的用法,这里做个对比: 功能对比: A memcmp: 函数原型: int memcmp( ...

  3. 8年开发老司机告诉你啥是java开发?如何学?学习什么内容?

    什么是Java? 我从Java的官网上抄下来下面这段话:97% 的企业桌面运行 Java美国有 89% 的桌面(或计算机)运行 Java全球有 900 万 Java 开发人员开发人员的头号选择排名第一 ...

  4. Spring Cloud系列:不重启eureka,清除down掉的服务

    场景描述 做项目的时候,我的服务改了个ip,然后重新启动后,原ip的服务down掉了,但是没有清楚掉,还在上面,导致我用swagger测试的时候,访问不到真正up的程序.重启eureka又不划算,于是 ...

  5. 【HNOI 2019】JOJO

    Problem Description JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 \(x\) ...

  6. git常用情景和基础命令

    git常用情景和基础命令 将项目克隆到本地 --xxx是git的地址 git clone xxxx 或者初始化git(github提供滴) --新建一个readme.md文件 echo "# ...

  7. Linux逻辑卷的创建

    什么是LVM? LVM(逻辑卷管理器):是Linux环境下对磁盘分区进行管理的一种机制.主要作用是动态分配磁盘分区及调整磁盘分区大小,并且可以让多个分区或者物理硬盘作为一个逻辑卷(相当于一个逻辑硬盘) ...

  8. 使用 mitmdump 进行 selenium webDriver绕过网站反爬服务的方法 pdd某宝 可用

    安装:  pip install  mitmproxy 新建一个脚本 脚本代码: from mitmproxy import ctx injected_javascript = ''' // over ...

  9. VUE程序调试的方法

    目录 VUE程序调试的方法 1.写本文的背景 2.调试与测试 3.Console调试法 3.1 添加console.log指令 3.2 调出温度界面如下 3.3 Google浏览器的Console窗口 ...

  10. RESTful 架构风格

    在移动互联网的大潮下,『微服务』的概念也越来越被大家接受并应用于实践,日益增多的web service逐渐统一于RESTful 架构风格,如果开发者对RESTful 架构风格不甚了解,则开发出的所谓R ...