【问题标题】:Mongo regex query for field in list of embedded objectsMongo 正则表达式查询嵌入对象列表中的字段
【发布时间】:2011-07-24 08:24:12
【问题描述】:

我有一个包含这样记录的集合

> db.company.findOne({companyId:1})
{
"_id" : ObjectId("4e22ff08eefdd839f60ab95f"),
"lastUpdate" : ISODate("2011-07-11T17:00:00Z"),
"errorCount" : 0,
"house" : 49,
"phones" : [
    {
        "cityCode" : "3852",
        "number" : "461423",
        "type" : "phone"
    },
    {
        "cityCode" : "3852",
        "number" : "461317",
        "type" : "phone"
    }
],
"houseAdd" : "",
"rubricsId" : [
    NumberLong(184108177),
    NumberLong(184108175)
],
"companyId" : NumberLong(1)
}

现在我正在尝试查找电话号码以 8-800 开头的所有公司 我正在尝试搜索我的查询

db.company.find({"phones.number":/8-800.*/}

并得到一个空列表。但是

db.company.find({"phones.number":/8.*/})

返回电话号码以 8 开头的所有公司。 AFAIK '-' 在这种情况下不是正则表达式的特殊字符吗?我正在尝试正则表达式 '8\-800' ,结果相同。我哪里错了?

【问题讨论】:

  • 您是否尝试转义破折号 (8\-800.*)?也许 mongo 正则表达式引擎不喜欢破折号,即使它们在 [] 之外
  • 对不起,不要在我的帖子中转义\。已编辑。
  • 感谢您修正报价。如果你使用/8.800.*/ 会发生什么?您确定您有包含“8-800”的phones.number 值吗?
  • @mu 太短了 - 无论如何都可以很好地回答!使用 /8.800.*/ 我得到一个空结果:(。是的,我知道电话 8-800-2000-245 的 companyId 并且可以通过 companyId 使用 findOne 看到它
  • 我正在使用 mongo 1.8.2,如果有关系的话

标签: regex object mongodb


【解决方案1】:

也许您的数据中有一些有趣的 Unicode,只是因为它看起来像一个连字符并不意味着它是一个连字符。您可以尝试使用findOne 查找您要查找的条目,然后通过十六进制转储程序运行数据,以查看它是否真的是普通的 ASCII 连字符或一些看起来像连字符的 Unicode 内容。如果是这种情况,请将您的搜索模式放宽为 /^8\W+800/ 并对其进行调整,直到找到您正在寻找的内容。

顺便说一句,你不是第一个遇到棘手的 Unicode 的人:

String is not equal to itself

【讨论】:

    【解决方案2】:

    另一种可能的解决方案:

    /^\D*8\D*800/
    
    • ^ 确保这是字符串的开头
    • \D* 任意数量的非十进制字符,匹配您在 8800 之间得到的任何字符(数字除外)。

    如果您知道所有这些字符串都以数字而不是其他任何内容开头,则可能不需要第一个 \D*

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2020-10-15
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多