mongodb正則$regex命令行簡單使用


Mongodb正則$regex

正則能幫助我們實現一些復雜的查詢,mongodb中實現正也很簡單

https://docs.mongodb.com/manual/reference/operator/query/regex/index.html

查詢格式

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

options可選值

i:不區分大小寫

m:如果字符串中包含\n,m會將\n后面的字符也當成一行處理,這對一個字符串中存在多行的情況比較有用

x:忽略字符串中的注釋和換行(注釋以#開頭)?

s:允許點匹配所有字符?

命令行操作

測試數據

> db.user_info.insertMany([{"name":"liuqingyun"},{"name":"jeams bean"},{"name":"liuqing"},{"name":"Doc veren"},{"name":"doc jan"},{"name":"yuhuanhuan"},{"name":"liu #ming \n ming"},{"name":"doc liu"},{"name":"DOC jeson"}])

1、查詢name以包含liu和yu名稱

db.user_info.find({"name":{"$in":[/liu/,/yu/]}})
> db.user_info.find({"name":{"$in":[/liu/,/yu/]}})
{ "_id" : ObjectId("5ec101d873e561131511bf15"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec101d873e561131511bf17"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec101d873e561131511bf1a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec101d873e561131511bf1b"), "name" : "liu #ming \n ming" }
{ "_id" : ObjectId("5ec101d873e561131511bf1c"), "name" : "doc liu" }
View Code

2、查詢name以liu和yu開頭的名稱

db.user_info.find({"name":{"$in":[/^liu/,/^yu/]}})
> db.user_info.find({"name":{"$in":[/^liu/,/^yu/]}})
{ "_id" : ObjectId("5ec101d873e561131511bf15"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec101d873e561131511bf17"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec101d873e561131511bf1a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec101d873e561131511bf1b"), "name" : "liu #ming \n ming" }
View Code

3、查詢name不包含liu和yu字符的名稱

db.user_info.find({"name":{"$nin":[/liu/,/yu/]}})
> db.user_info.find({"name":{"$nin":[/liu/,/yu/]}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

4、使用$not查詢name不包含liu的字符

db.user_info.find({"name":{"$not":/liu/}})
> db.user_info.find({"name":{"$not":/liu/}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

或者使用

db.user_info.find({"name":{"$not":{"$regex":/liu/}}})
> db.user_info.find({"name":{"$not":{"$regex":/liu/}}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

或者使用

db.user_info.find({"name":{"$not":{"$regex":"liu"}}}
> db.user_info.find({"name":{"$not":{"$regex":"liu"}}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

5、使用$not查詢不以liu開頭的字符

db.user_info.find({"name":{"$not":/^liu/}})
> db.user_info.find({"name":{"$not":/^liu/}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

或者使用

db.user_info.find({"name":{"$not":{"$regex":/^liu/}}})
> db.user_info.find({"name":{"$not":{"$regex":/^liu/}}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

或者使用

db.user_info.find({"name":{"$not":{"$regex":"^liu"}}})
> db.user_info.find({"name":{"$not":{"$regex":"^liu"}}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

經測試,mongodb的正則表達式中/可以用“代替,這樣在java代碼調用時也比較容易,如下使用“代替/測試

6、查詢name中包含liu的名稱

db.user_info.find({"name":{"$regex":"liu"}})
> db.user_info.find({"name":{"$regex":"liu"}})
{ "_id" : ObjectId("5ec1037873e561131511bf25"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec1037873e561131511bf2b"), "name" : "liu #ming \n ming" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
View Code

7、查詢name中以liu開頭的名稱

db.user_info.find({"name":{"$regex":"^liu"}})
> db.user_info.find({"name":{"$regex":"^liu"}})
{ "_id" : ObjectId("5ec1037873e561131511bf25"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec1037873e561131511bf2b"), "name" : "liu #ming \n ming" }
View Code

8、查詢name以liu結尾的名稱

db.user_info.find({"name":{"$regex":"liu$"}})
> db.user_info.find({"name":{"$regex":"liu$"}})
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
View Code

9、查詢包含yu,緊跟着兩個huan字符串的名稱

db.user_info.find({"name":{"$regex":"yu(huan){2}"}})
> db.user_info.find({"name":{"$regex":"yu(huan){2}"}})
{ "_id" : ObjectId("5ec1037873e561131511bf2a"), "name" : "yuhuanhuan" }
View Code

10、查詢name以l開頭,g結尾的名稱

db.user_info.find({"name":{"$regex":"^l.*g$"}})
> db.user_info.find({"name":{"$regex":"^l.*g$"}})
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
View Code

11、查詢以doc開頭的名稱,不區分大小寫,mongodb正則默認區分大小寫

db.user_info.find({"name":{"$regex":"(?i)^doc"}})
> db.user_info.find({"name":{"$regex":"(?i)^doc"}})
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

或者

db.user_info.find({"name":{"$regex":/^doc/i}})

12、匹配以jeams開頭的字符串(正則m字符使用)

在之前數據基礎上插入如下數據

db.user_info.insertOne({"name":"ming #wang \njeams jan"})
> db.user_info.find({"name":{"$regex":"^jeams"}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" 

該命令只返回一行數據

> db.user_info.find({"name":{"$regex":"(?m)^jeams"}})
{ "_id" : ObjectId("5ec1037873e561131511bf26"), "name" : "jeams bean" }
{ "_id" : ObjectId("5ec10f7e73e561131511bf2f"), "name" : "ming #wang \njeams jan" }

加上正則字符m,返回兩行數據,m將\n當成換行符處理。而不是一個普通的字符

13、使用點配置所有字符

文檔中講,使用s可以配置包括換行符在內的所有字符,但是不使用s,似乎也是可以配置到所有字符?

> db.user_info.find({"name":{"$regex":"liu.*g"}})
{ "_id" : ObjectId("5ec1037873e561131511bf25"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec1037873e561131511bf2b"), "name" : "liu #ming \n ming" }
> 
> db.user_info.find({"name":{"$regex":"(?s)liu.*g"}})
{ "_id" : ObjectId("5ec1037873e561131511bf25"), "name" : "liuqingyun" }
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
{ "_id" : ObjectId("5ec1037873e561131511bf2b"), "name" : "liu #ming \n ming" }

14、查詢name以liu開頭,后面跟着4個字符的名稱

 db.user_info.find({"name":{"$regex":"^liu.{4}$"}})
> db.user_info.find({"name":{"$regex":"^liu.{4}$"}})
{ "_id" : ObjectId("5ec1037873e561131511bf27"), "name" : "liuqing" }
View Code

 15、查詢以doc開頭全部忽略大小寫的名稱

db.user_info.find({"name":{"$regex":"(?i)^Doc"}})
> db.user_info.find({"name":{"$regex":"(?i)^Doc"}})
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf29"), "name" : "doc jan" }
{ "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

16、查詢以D開頭,其他字符忽略大小寫的名稱

db.user_info.find({"name":{"$regex":"^D(?i)oc"}})
> db.user_info.find({"name":{"$regex":"^D(?i)oc"}})
{ "_id" : ObjectId("5ec1037873e561131511bf28"), "name" : "Doc veren" }
{ "_id" : ObjectId("5ec1037873e561131511bf2d"), "name" : "DOC jeson" }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM