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

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

原文地址:https://www.cnblogs.com/xuliuzai/p/11209688.html

时间: 2024-10-12 12:50:18

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

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

MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限.这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 MongoDB 数据库的内容.在一些项目当中,这种使用方式会被看成是一种安全漏洞. 本文介绍如何在单台 MongoDB 服务器上设置鉴权.设置完后,MongoDB 客户端必须用正确的用户名和密码登录,才能在指定的数据库中操作. 首先介绍下 MongoDB 的用户和权限.每个数据库都有自己的用户,创建用户的命令

MongoDB简单使用-查询操作3

首先添加几个文档: dvd = ({"Type":"DVD","Title":"Matrix,The","Released":1994,"Cast":["Keanu Reeves","Carrie-Anne Moss","Laurence Fishburne","Hugo Weaving","Glo

分析Jedis源码实现操作非关系型数据库Redis

如果测试项目用的maven依赖,先把maven坐标准备好 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version></dependenc

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

 在这里  如果改成User user=null; 后面 对user对象的赋值是会失败的. 原因: 要赋值的话,一定要有对象,要new一下给对象分配空间然后再给对象赋值. 原文地址:https://www.cnblogs.com/Strugglinggirl/p/11963541.html

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

一:NoSql数据库 什么是NoSQL? NoSQL,指的是非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据).这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展. 为什么使用NoSQL ? 今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据.用户的个人信息,社交网络,地理

解密陌生人(6)数据库操作工具和文件操作类

提示: 因为工程稍微有点大对我个人来说,所以可能在某些方面讲的不清楚或逻辑性不够强,如果有问题请及时@我. 原工程:https://github.com/LineChen/ 在具体介绍各项操作之前先介绍一下数据库操作类和文件操作类. 数据库:MySQL.MVC模式 SqlHelper : package com.database; import java.sql.*; import java.util.regex.Matcher; import java.util.regex.Pattern;

关系型数据库与Key-value型数据库Mongodb模式设计对比

MongoDb 相比于传统的 SQL 关系型数据库,最大的不同在于它们的模式设计( Schema Design )上的差别,正是由于这一层次的差别衍生出其它各方面的不同. 我们可以简单的认为关系型数据库由数据库.表(table).记录(record)三个层次概念组成,而在构建一个关系型数据库的时候,工作重点和难点都在数据库表的划分与组织上.一般而言,为了平衡提高存取效率与减少数据冗余之间的矛盾,设计的数据库表都会尽量满足所谓的第三范式.相对的,可以认为MongoDb由数据库.集合(collect

monggodb 模糊查询

MongoDB的模糊查询其实很简单:      11.LIKE模糊查询userName包含A字母的数据(%A%)       SQL:SELECT * FROM UserInfo WHERE userName LIKE "%A%"       MongoDB:db.UserInfo.find({userName :/A/}) 12.LIKE模糊查询userName以字母A开头的数据(A%).       SQL:SELECT * FROM UserInfo WHERE userName

3.QT数据库综合案例,模糊查询等操作

 1 新建一个项目: Database01.pro SOURCES += \ main.cpp \ Contact.cpp QT += gui widgets sql CONFIG += C++11 HEADERS += \ Contact.h Contact.h #ifndef CONTACT_H #define CONTACT_H   #include <QWidget> #include <QSqlTableModel> #include <QTableView&g