这是我的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" }
显然,正则表达式/a:[^:]+/
和/a:[a-z]+/
不应该与字符串'a:b:c'
匹配,但看起来Mongo在此正则表达式上失败了,有人知道这里发生了什么吗?
它被提交给MongoDB Jira,as a bug ticket,所以它是MongoDB查询结构中的一个错误吗?
答案 0 :(得分:9)
问题在于部分匹配,因为您没有限制整个单词的正则表达式,a:b:c
中a:b
中存在的部分匹配导致您获得该文档。< / p>
使用以下正则表达式^$
作为锚点来表示单词的开头和结尾;
db.foo.find({path: /^a:[^:]+$/})
db.foo.find({path: /^a:[a-z]+$/})
这将使正则表达式适用于整个字符串,并忽略部分匹配,如上所述。有关正则表达式锚点的更多信息,请click here。
所以,总而言之,没有错误,只是滥用了正则表达式。