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

Regex 嵌入对象列表中字段的Mongo正则表达式查询,regex,object,mongodb,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" : "46

我收集了一些像这样的唱片

> 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'-'不是正则表达式的特殊字符吗?我尝试使用regex'8 \-800'获得相同的结果。我错在哪里?

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

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


另一种可能的解决办法:

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

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

您是否尝试过转义破折号(
8-800.
)?也许mongo regex引擎不喜欢破折号,即使破折号在
[]
之外。对不起,不要在我的帖子中转义。已编辑。感谢您修改报价。如果使用
/8.800.*/
,会发生什么情况?你确定你有
手机。数字
值包含“8-800”?@mu太短-Thnx无论如何都不适合回答!使用/8.800.*/我得到一个空结果:(.是的,我知道一个公司ID的电话是8-800-2000-245,可以通过findOne by Company查看它。我使用mongo 1.8.2,如果有关系的话