Mongo正则表达式查询嵌入对象列表中的字段

时间:2011-07-24 08:24:13

标签: regex object mongodb

我有一个像这样的记录的集合

> 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',结果相同。哪里错了?

2 个答案:

答案 0 :(得分:2)

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

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

  

String is not equal to itself

答案 1 :(得分:1)

另一种可能的解决方案:

/^\D*8\D*800/
  • ^确保这是在字符串的开头
  • \D*任意数量的非小数字符,匹配8800之间的所有内容(数字除外)。

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