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*
任意数量的非十进制字符,匹配您在 8
和 800
之间得到的任何字符(数字除外)。
如果您知道所有这些字符串都以数字而不是其他任何内容开头,则可能不需要第一个 \D*
。
【讨论】:
以上是关于Mongo 正则表达式查询嵌入对象列表中的字段的主要内容,如果未能解决你的问题,请参考以下文章
mongo 正则表达式查询是不是有字符限制,如果正则表达式搜索字符串超过该限制,则会引发错误