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" }
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" }
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" }
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" }
或者使用
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" }
或者使用
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" }
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" }
或者使用
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" }
或者使用
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" }
經測試,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" }
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" }
8、查詢name以liu結尾的名稱
db.user_info.find({"name":{"$regex":"liu$"}})

> db.user_info.find({"name":{"$regex":"liu$"}}) { "_id" : ObjectId("5ec1037873e561131511bf2c"), "name" : "doc liu" }
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" }
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" }
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" }
或者
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" }
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" }
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" }