MongoDB正则表达式匹配麻烦

Gel*_*Luo 7 regex mongodb mongodb-query

这是我的MongoDB shell会话;

> 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" }
Run Code Online (Sandbox Code Playgroud)

显然,正则表达式/a:[^:]+//a:[a-z]+/不应该匹配的字符串'a:b:c',不过貌似蒙戈未能在这个表达式,没有人知道这里发生了什么?

作为bug票提交给MongoDB Jira,所以它是MongoDB查询结构中的一个错误吗?

bur*_*ete 9

麻烦的是与部分匹配,因为你没有限制整个字正则表达式,即存在于部分匹配a:b:ca:b是导致你得到该文档.

使用以下正则表达式^$作为锚点来表示单词的开头和结尾;

db.foo.find({path: /^a:[^:]+$/})
db.foo.find({path: /^a:[a-z]+$/})
Run Code Online (Sandbox Code Playgroud)

这将使正则表达式适用于整个字符串,并忽略部分匹配,如上所述.有关正则表达式锚点的更多信息,请单击此处.

所以,总而言之,没有错误,只是滥用正则表达式.