【问题标题】:Regex expression to check whether two folder paths are same正则表达式检查两个文件夹路径是否相同
【发布时间】:2020-06-08 11:17:04
【问题描述】:

在 mongodb 文档中,我们有一个具有如下值的键:

a/b
a/b/c
b/c/d

如果两条路径相等或一条路径包含另一条路径,则两条路径相同。例如:

a/b, a/b - 相同

a/b, a/b/c - 与第一个相同包含其他

a/b, a/c - 不同。即使父母相同,他们也有不同的孩子路径

a/b, a/bc - 不同

a/b, /a/b/ - 相同

现在,在插入新文档时,我必须检查该路径是否唯一。我必须动态生成正则表达式来检查。是否可以使用正则表达式来做到这一点?

假设a/b/c 已经存储在数据库中。新文档包含a/b,我可以编写类似^/{0,10}a/{1,10}b/{0,10} 的正则表达式。但是如果db包含a/b并且新文档包含a/b/c/d,如何为a/b/c/d编写正则表达式使其匹配a/b

【问题讨论】:

  • “a/b”和“a/b/c”不违反约束吗?
  • 两者都相同,因为 a/b 包含路径 a/b/c。问题是我在a/b 文件夹中写的任何内容都可以覆盖 a/b/c
  • 包含还是前缀/后缀? b/c 和 a/b/c/d 呢?包含在树结构或字符串的意义上?
  • 这是一个前缀。 b/c 和 a/b/c/d 无效。想象一个文件夹结构 /a 和文件夹 a/b。在第一种情况下有一个文件夹 a 。在第二种情况下,文件夹 a 中有一个文件夹 b。这就是我所说的“包含”。很抱歉造成混乱。

标签: regex mongodb mongodb-query regex-lookarounds


【解决方案1】:

Now you have two problems =)

虽然如果您考虑非正则表达式解决方案,您可以从$indexOfCP operator 中受益。如果我收到您的问题(假设“代码”sn-p 中有错字),您想检查两个字符串中的任何一个是否从另一个开始或等于另一个。用 mongo 术语:

db.collection.find({
  $expr: {
    $or: [
      {
        $eq: [
          0,
          {
            $indexOfCP: [
              "$fieldname",
              theString
            ]
          }
        ]
      },
      {
        $eq: [
          0,
          {
            $indexOfCP: [
              theString,
              "$fieldname"
            ]
          }
        ]
      },

    ]
  }
})

其中fieldname 是您的关键属性的名称,theString 是您正在测试的字符串。

【讨论】:

  • 感谢您的回答。实际上,它并不像子字符串问题那么简单。 a/ba/bc 不一样。正则表达式很痛苦,但我想这样做,因为a///b 可以匹配a/b。这是问题的另一部分
  • 我会采用路径的规范化 - 添加尾部斜杠并删除连续的斜杠。无论如何,我的观点仍然存在 - 如果您想使用正则表达式并且可以在较长的字符串中找到较短的字符串,请添加具有相同正则表达式和反转参数的 $or 子句。
  • 是的,这很有帮助。不会很贵吗?但我想总比没有好。
  • 您已经拥有的直接正则表达式^/{0,10}a/{1,10}b/{0,10} 实际上可以更快 - 它锚定到字符串的开头并且可以从索引中受益。 $indexOfCP 不能。但是反向搜索是完全不同的事情—— $indexOfCP 的成本相同,但为每个文档构建一个新的正则表达式会非常慢。正如我所说 - 考虑标准化。您在插入/更新时为每个文档执行一次,它将在查询时为您节省数十亿的 CPU 滴答声。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2010-09-19
  • 2014-07-30
  • 1970-01-01
  • 2012-01-05
  • 2013-12-09
相关资源
最近更新 更多