源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 395|回复: 19

[正则表达式] MongoDB正则表达式及应用

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2018-12-25 19:30:04 | 显示全部楼层 |阅读模式
mongodb中完全支持正则表达式,一般查询中可以使用操作符$regex,本文主要给大家介绍MongoDB正则表达式及应用,介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

正则表达式常用来在所有语言中搜索字符串的任何模式或文字。MongoDB还提供了正则表达式功能的字符串模式使用正则表达式$regex操作符。MongoDB使用PCRE(Perl兼容正则表达式)为正则表达式语言。

不同于文本搜索,我们不需要做任何配置或命令就能直接使用正则表达式。

考虑下包含文字后其标签的帖子集合,文档结构如以下:

{
 "post_text": "enjoy the mongodb articles on yiibai",
 "tags": [
  "mongodb",
  "yiibai"
 ]
}

使用正则表达式表达

下面的正则表达式查询搜索所有包含字符串 yiibai.com 的帖子:

复制代码 代码如下:
>db.posts.find({post_text:{$regex:"yiibai.com"}})

同样的查询也可以写为:

>db.posts.find({post_text:/yiibai.com/})

使用正则表达式不区分大小写

为了使搜索不区分大小写,我们使用$options 带有值参数 $i。下面的命令会搜索字符串:yiibai.com,不论大小写:

复制代码 代码如下:
>db.posts.find({post_text:{$regex:"yiibai",$options:"$i"}})

该查询重新调整的结果是:其中在大小下包含词语 yiibai 文档,如以下:

{
 "_id" : ObjectId("53493d37d852429c10000004"),
 "post_text" : "hey! this is my post on Yiibai", 
 "tags" : [ "yiibai" ]
} 

使用正则表达式的数组元素:

我们还可以使用数组字段正则表达式概念。 这时候我们实现标签的功能显得尤为重要。 所以,如果想要搜索带有标签以词组tutorial开始所有的帖子(无论是tutorial或tutorials或tutorialjava或tutorialphp),都可以使用下面的代码:

复制代码 代码如下:
>db.posts.find({tags:{$regex:"tutorial"}})

优化正则表达式查询:

如果文档字段已被索引,查询将使用使用索引值的匹配正则表达式。 这使得搜索非常快,正则表达式相对于扫描整个集合。

如果正则表达式是一个前缀表达式,所有的匹配是以某一串字符开始。例如,如果正则表达式 ^tut, 查询有只搜索那些开始串 tut.

mongodb正则表达式应用

mongodb中完全支持正则表达式,一般查询中可以使用操作符$regex

db.lnmopy.find( { 'name': /*.lnmopy.com/i } )
db.lnmopy.find( { 'name': { $regex: '*.lnmopy.com', $options: 'i' } } )

以上两种完全等价,可以直接对域(field)即上例中的'name'键,使用正则表达式或者使用操作符,可选项目是i,即忽略大小写。
关于正则可选项,mongodb和其他语言标准正则稍有不同,有自己的标准。

$options的可选值

i 忽略大小写;

m 多行查找,如果内容里面不存在换行符号(例如 \n)或者构造上没有(start/end),该选项没有任何效果;
x 空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略;

s 圆点元字符(.)匹配所有的字符,包括换行符

假设我们有一个数据库名为mongoDemo

use mongoDemo

数据库中有个集合名为lnmopy

db.lnmopy.find()

有如下数据:

{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "www.lnmopy.com", "site" : "website", "tag" : "l,n,m,o,p,y"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "demo.lnmopy.com", "site" : "unknown", "tag" : "d,e,m,o"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "welcome.lnmopy.com", "site" : "website", "tag" : "w,e,l,c,o,m,e"}

mongodb的正则表达式仅支持i和m的javascript原生写法(如/*.lnmopy.com/i)。如果要是用x和s选项就必须使用“$regex”操作符并在“$options”中指定选项。

使用正则表达式的更新操作:

db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } );

意思是,查找当前数据库中名为“lnmopy”的集合中“name”字段符合“/*.lnmopy.com/i”正则的条目,并只将“site”字段更新为“www.lnmopy.com”,该条更新语句仅更新一条数据,如果不是用$set,那么这条记录就会只剩下你更新的部分和默认的ObjectId,可以说是替换了。如果想替换所有,可以加入参数:

db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } , false, true);

参数有顺序,false是upsert,如果没有就插入新的。true就是multi多条记录更新,所有匹配到的结果。或者直接指定{ multi: true }:
db.lnmopy.update( { 'name': /*.lnmopy.com/i }, { $set: { 'site':'www.lnmopy.com' } } , { multi: true });
这样就把所有的“site”字段全都更新为“www.lnmopy.com”了。

我设计的字段“tag”有个缺陷,就是本来是一个单词,现在每个字母都被“,“分隔开了。实际工作中也存在类似问题,由于批量转换数据,或者其他程序操作不当,或者业务需求更改等等原因需要对某些字段进行正则批量处理,mongodb的一般更新方法是不能实现的,这时就需要使用javascript语句。

正则表达式替换查询结果中','为”

db.lnmopy.find().forEach( function(u) { u.tag = u.tag.replace(/\,/, ""); db.lnmopy.save(u); } );

最后执行

db.lnmopy.find()

显示如下数据:

{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "www.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "lnmopy"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "demo.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "demo"}
{ "_id" : ObjectId("502dd63d16a25b1ff6000000"), "name" : "welcome.lnmopy.com", "site" : "www.lnmopy.com", "tag" : "welcome"}

后记:javascript是mongodb的一大特色,也是优势,很多复杂的查询和处理都可以用javascript实现,要注意的是,javascript的工作效率较低,原则上应该尽量避免在主要业务逻辑中大量使用。类比的讲,javascript就相当于oracle的存储过程,介于10gen(mongodb的开发团队)是由oracle出来的这点,就一点也不奇怪了。关于如何使用更复杂的javascript,以后会写到。

回复

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-9-11 03:23:26 | 显示全部楼层
飞飞飞飞飞飞飞飞飞飞飞飞飞
回复 支持 反对

使用道具 举报

9

主题

2万

回帖

420

积分

中级会员

Rank: 3Rank: 3

积分
420
发表于 2023-1-31 11:36:10 | 显示全部楼层
看看看咋么
回复 支持 反对

使用道具 举报

1

主题

1386

回帖

1509

积分

金牌会员

Rank: 6Rank: 6

积分
1509
发表于 2023-2-24 03:00:58 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊啊啊啊
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-5-2 02:32:34 | 显示全部楼层
的谁vdvdsvdsvdsdsv
回复 支持 反对

使用道具 举报

匿名  发表于 2023-5-2 02:37:28

На Gou.ru - только проверенные букмекеры!

Полезные статьи про ставки на спорт gou.ru

Приглашаем вас на онлайн портал, где находятся списки профессиональных капперов и букмекерских контор. В РФ есть много контор, где можно ставить ставки на различные виды спорта, таким образом зарабатывая деньги. А также есть множество капперов — людей, которые дают прогнозы по спортивным матчам, помогают зарабатывать любым желающим. Людям, которым интересны ставки и вспомогательный заработок, необходимо отыскать профессионального каппера, который будет отдавать точные прогнозы.

Относительно официальный сайт pari ru  заходите на gou.ru уже сегодня. Здесь вы сможете найти всю важную информацию о законных букмекерских конторах, которые работают в РФ. Также мы размещаем разные прогнозы на спорт всех видов, всё о капперских расчетах, с которыми можно связываться, и с которыми лучше не стоит. Наш сайт не занимается рекламой, мы совершаем выводы лишь на собственном опыте и фактах. Мы ежедневно следим за известиями в области ставок, проверяем информацию и только потом размещаем её для гостей нашего сайта.

У нас размещено большое количество полезных статей о ставках на спорт, также размещены все правила и советы от профессионалов. Вы знаете, как верно выбрать букмекера, как пускать в ход все те самые прогнозы, о которых известно многим и сбавить вероятность неудачи? Мы да, и с удовольствием будем делиться своими познаниями и опытом в представленной области. Вся информация для посетителей сайта полностью бесплатно, переходите на gou.ru и применяйте на здоровье.

Если Вы искали mostbet  в сети интернет, то вы на верном пути. Для Вас большое количество публикаций о ставках на спорт и как заработать деньги, ничего не упустив. Информация будет актуальна не только для тех, кто уже в теме. Также для новичков множество полезной информации и советов.

Сайт gou.ru поделён на несколько тематик: капперы, библиотека беттинга, приложения букмекеров и другие. В каждой теме множество статей и важной информации, подробные разборы и образцы. Если Вы искали что-то конкретное, то следует воспользоваться поисковой строкой. Вся информация регулярно обновляется, в связи с новостями. Мы ежедневно публикуем новые статьи и убираем неинтересные.

Сегодня букмекеры только набирают популярность. И многим важно не только иметь деньги на этом, но и быть среди популярных занятий. Для отдельных людей это интересное занятие в нерабочее время. А для тех, кто занимается спортом, различными видами или определенным, то скорее всего им будет нетрудно делать прогнозы самому на определенную команду, зная их сильные качества. Во всяком случае на нашем сайте вам будет продуктивно остановиться. Получить информацию и переходить к ставкам.
回复 支持 反对

使用道具

0

主题

2万

回帖

124

积分

注册会员

Rank: 2

积分
124
发表于 2023-10-6 12:05:03 | 显示全部楼层
哦哦哦哦哦哦哦哦哦
回复 支持 反对

使用道具 举报

6

主题

2万

回帖

247

积分

中级会员

Rank: 3Rank: 3

积分
247
发表于 2023-11-30 18:44:35 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

174

积分

注册会员

Rank: 2

积分
174
发表于 2023-12-1 01:51:00 | 显示全部楼层
笑纳了老板
回复 支持 反对

使用道具 举报

12

主题

2万

回帖

431

积分

中级会员

Rank: 3Rank: 3

积分
431
发表于 2024-3-15 18:53:47 | 显示全部楼层
哈哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-28 15:59 , Processed in 0.182371 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表