【问题标题】:MongoDB regex matching troubleMongoDB正则表达式匹配问题
【发布时间】:2017-09-21 23:23:09
【问题描述】:

这是我的 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 查询结构中的错误吗?

【问题讨论】:

    标签: regex mongodb mongodb-query


    【解决方案1】:

    问题在于部分匹配,因为您没有限制整个单词的正则表达式,a:b:c 中存在的部分匹配a:b 会导致您获得该文档。

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

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

    这将使正则表达式适用于整个字符串,并忽略上面解释的部分匹配。有关正则表达式锚点的更多信息,click here

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

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多