2017-04-25 100 views
5

這是我的MongoDB shell會話;MongoDB正則表達式匹配問題

> db.foo.save({path: 'a:b'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.findOne() 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 

> db.foo.save({path: 'a:b:c'}) 
WriteResult({ "nInserted" : 1 }) 

> db.foo.find({path: /a:[^:]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

> db.foo.find({path: /a:[a-z]+/}) 
{ "_id" : ObjectId("58fedc47622e89329d123ee8"), "path" : "a:b" } 
{ "_id" : ObjectId("58fedc57622e89329d123ee9"), "path" : "a:b:c" } 

顯然,正則表達式/a:[^:]+//a:[a-z]+/不應該匹配字符串'a:b:c',不過貌似蒙戈未能在這個表達式,沒有人知道這裏發生了什麼?

它被提交給MongoDB Jira,as a bug ticket,這是MongoDB查詢結構中的一個錯誤嗎?

回答

8

問題在於部分匹配,因爲您不限制整個單詞的正則表達式,因此a:b:c中存在的部分匹配即a:b正在導致您獲取該文檔。

使用以下正則表達式與^$這些錨是表示單詞的開始和結尾;

db.foo.find({path: /^a:[^:]+$/}) 
db.foo.find({path: /^a:[a-z]+$/}) 

這將使正則表達式適用於整個字符串,並忽略部分匹配,如上所述。有關正則表達式錨點的更多信息,請參閱click here

所以,總之,沒有錯誤,只是誤用了正則表達式。