2017-04-25 58 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

所以,总之,没有错误,只是误用了正则表达式。