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

Posted

技术标签:

【中文标题】Mongo 正则表达式查询嵌入对象列表中的字段【英文标题】:Mongo regex query for field in list of embedded objects 【发布时间】: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,如果有关系的话 【参考方案1】:

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

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

String is not equal to itself

【讨论】:

【参考方案2】:

另一种可能的解决方案:

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

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

【讨论】:

以上是关于Mongo 正则表达式查询嵌入对象列表中的字段的主要内容,如果未能解决你的问题,请参考以下文章

mongo 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误

elasticsearch通配符和正则表达式查询

正则表达式提取嵌入在 XML 字符串中的 JSON 对象

Mongo正则表达式为“不匹配”或反向

Node.js 和 Mongoose 正则表达式查询多个字段

使用正则表达式的 Rmongodb 无法按预期工作