我正在尝试构建一个查询,以便在phoneNumber中找到MongoDB。例如,我的数据库中有这样的数字:
我想在一个查询中找到它们
mobilePhone: { $regex: "+3367197", $options: "i" }我已经试过了,但没有用:
mobilePhone: { $regex: "+3367197", $options: "i", $in: [/^\+?[\d\. ]+/] }你知道怎么做吗?
谢谢你的帮助;)
发布于 2021-09-28 12:26:04
我认为你应该从糟糕的格式化电话中清除数据库。也不允许坏的格式化电话进入数据库,在插入前清理它们。
bellow查询在格式错误的电话中工作。
第一步是清洁电话(只保留数字和+符号,如果在前面)。然后做你想要的匹配。
您可以使用清理电话的第一部分清除所有数据库,并使用管道更新(如updateMany({},[{"$set" ...}]) )。
此外,当您试图匹配时,您应该转义正则表达式特殊字符,例如,不是{regex : "+33.."},而是{regex : "\\+33"},如下面的示例所示。
对于那些自动查看这个答案也是的函数,
查询
db.collection.aggregate([
{
"$set": {
"phone": {
"$reduce": {
"input": {
"$regexFindAll": {
"input": "$phone",
"regex": "^\\+|\\d+"
}
},
"initialValue": "",
"in": {
"$concat": [
"$$value",
"$$this.match"
]
}
}
}
}
},
{
"$match": {
"$expr": {
"$regexMatch": {
"input": "$phone",
"regex": "\\+3367197"
}
}
}
}
])发布于 2022-05-17 16:20:10
.aggregate()解决方案很棒,而且会工作的!但是afaik it 将在使用MongoDB的后端查询中添加性能成本。
另一种方法是在搜索值的每个数字之间使用“神奇的正则分隔符”。
分隔符:\D*
\D的意思是“匹配任何不是数字的单个字符(与^0-9相同)”。*的意思是“零或多个匹配”因此,如果用户正在搜索123567,而db有123-567,那么最终您将查找regex:
1\D*2\D*3\D*5\D*6\D*7\D*这样,在DB中的数字之间出现的任何其他字符(括号、破折号等)使用修改的正则表达式忽略。而且不需要进行额外的聚合。
实际代码如下所示:new RegExp(search.replace(/\D/g, '').split('').join('\\D*'), 'i')
希望这能帮上忙!
https://stackoverflow.com/questions/69360098
复制相似问题