• mongodb 字符串查找匹配中$regex的用法


    官网地址:https://docs.mongodb.com/manual/reference/operator/query/regex/#regex-case-insensitive

    举个例子来说:现在有以下集合(官网的例子):

    { "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
    { "_id" : 101, "sku" : "abc789", "description" : "First line Second line" }
    { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
    { "_id" : 103, "sku" : "xyz789", "description" : "Multiple line description" }

    db.collection.find( { sku: /adC/i } );等效于下面这种写法
    db.collection.find( { sku: { $regex: 'abC', $options: 'i' } } );
    以上是个简单的应用。

    参数介绍:
    Option ===== Description
    参数 i ====== 加了这个参数,表示不区分大小写

    参数 m ===== 个人理解这个参数是用来匹配value中有换行符( )的情形。
    还有一个情形是:匹配规则中使用了锚,所谓的锚就是^ 开头, $ 结束
    比如:db.products.find( { description: { $regex: /^S/, $options: 'm' } } )
    上面匹配规则的意思就是匹配description字段的value值中,以大写S开头的value值。
    匹配后结果是:

    { "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
    { "_id" : 101, "sku" : "abc789", "description" : "First line Second line" }

    可以看出,第二条记录中descriptio的值包含 换行字符,而他之所以能匹配出来就是因为
    添加了m 参数。
    假设没有添加m参数,语句就是

    db.products.find( { description: { $regex: /^S/} }

    此时匹配结果为

    { "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

    再比如我们连锚都不写也就是去掉^符合,语句变成

    db.products.find( { description: { $regex: /S/ } } )

    此时结果为:

    { "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
    { "_id" : 101, "sku" : "abc789", "description" : "First line Second line" }

    此时可以分析出m参数的使用场景:
    应该是为了匹配字段value值中以某个字符开头(^),或者是某个字符结束($).即便value中包含换行符( )也能匹配到。
    从上例最后例子看出,m参数应该是和锚同时使用才有意思,否则直接去匹配也能匹配出来。说明m是在特殊需求下才使用的!

    参数 s ===== 允许点字符(.)匹配所有的字符,包括换行符。

    比如语句:

    db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )

    匹配value中包含m且之后为任意字符包括换行符并且还包含line字符的字符串。不区分大小写
    结果为:

    { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
    { "_id" : 103, "sku" : "xyz789", "description" : "Multiple line description" }

    如果不加s参数时,语句为:

    db.products.find( { description: { $regex: /m.*line/, $options: 'i' } } )

    结果为:

    { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }

    参数 x ====== 官网的大意是忽视空白字符。
    ---------------------
    作者:山鬼谣me
    来源:CSDN
    原文:https://blog.csdn.net/u013066244/article/details/51491556
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Linux 线程的互斥和等待 pthread_mutex_lock/pthread_mutex_unlock pthread_cond_wait/pthread_cond_signal
    Ubuntu12.10 双显卡过热问题
    Ubuntu apt-get 无法使用的问题
    Unload Java JNI DLL
    python笔记(19)--面向对象三大特性补充
    python笔记(18)--类的命名空间、实例化绑定方法和类的组合用法
    python笔记(17)--初识面向对象和三大特性(封装/继承/多态)
    python笔记(16)--迭代器、生成器和logging模块
    python笔记(15)--模块扩展(time/json/shutil/logging)和异常捕获处理
    python笔记(14)--内置模块(json重要)
  • 原文地址:https://www.cnblogs.com/pangguoming/p/9933045.html
Copyright © 2020-2023  润新知