Azure MongoDB中查询数组元素含'-'或'.'的文档方法
解决MongoDB 3.2.0中数组元素正则查询的问题
针对你在Azure MongoDB 3.2.0版本遇到的persons数组内number字段正则查询无效的问题,我整理了几个适配该版本特性的可行方案:
方案一:直接针对数组字段使用$regex查询
MongoDB对数组字段的查询默认会匹配数组中至少有一个元素满足条件的文档,你可以直接针对persons.number字段写正则条件,不需要额外的数组操作符。注意简化正则表达式,避免不必要的限制:
db.lists.find({ "persons.number": { $regex: /[-.]/ } })
如果你的客户端对正则字面量支持有问题,也可以用字符串形式的正则:
db.lists.find({ "persons.number": { $regex: "[-.]" } })
为什么之前的正则无效?
你之前用的/.*[-.]+.*/要求-或.的前后必须有至少一个字符,比如如果number是123-或者.123这类开头/结尾包含符号的情况,这个正则就匹配不到。而/[-.]/只要字符串中包含-或.任意一个字符就会匹配,完全符合你的需求。
方案二:用$elemMatch明确指定数组元素条件
如果直接查询还是有问题,可以用$elemMatch明确指定要匹配数组中的某个元素满足number字段的正则条件,这种写法在一些场景下能避免歧义:
db.lists.find({ persons: { $elemMatch: { number: { $regex: /[-.]/ } } } })
这个写法和方案一的效果完全一致,都是返回所有persons数组中存在至少一个number包含-或.的文档。
额外注意事项
- MongoDB 3.2使用PCRE正则引擎,所以你写的正则语法要符合PCRE规范,比如字符集中的
-如果不是用来表示范围(比如[a-z]),放在[-.]里是不需要转义的,直接写即可。 - 如果需要忽略大小写,可以加上
$options: "i"参数,比如{ $regex: "[-.]", $options: "i" },不过你的场景里应该不需要这个。
内容的提问来源于stack exchange,提问作者Dherik
相关产品推荐
相关产品推荐

