我有这个 Mongo 文档
{
_id: ObjectId('6616851ed50d6d1451fa8176'),
phone: "+7(926)458-54-52",
name: "Aboba"
}
如果用户输入
7926
,我想找到该文档,但我的过滤器也在过滤另一个字段。
我正在使用正则表达式电话或姓名进行过滤,但电话包含“+”和“()”,因此如果用户输入是
7926
,则不会找到它。
我该如何解决这个问题?
我的正则表达式:
{'$regex': f'\\w*{request_value}\\w*', '$options': 'i'}
我是这样过滤的:
{$or: [name: regex, phone: regex}
您可以创建一个名为
phoneForSearch
的已清理字符串,首先删除所有特殊字符。然后,使用正则表达式搜索 phoneForSearch
。
db.collection.aggregate([
{
"$set": {
"phoneForSearch": {
"$reduce": {
"input": {
"$regexFindAll": {
"input": "$phone",
"regex": "\\d+"
}
},
"initialValue": "",
"in": {
"$concat": [
"$$value",
"$$this.match"
]
}
}
}
}
},
{
"$match": {
$expr: {
$or: [
// phone search
{
$ne: [
-1,
{
"$indexOfCP": [
"$phoneForSearch",
//user input here
"7926"
]
}
]
},
// name search
{
"$regexMatch": {
"input": "$name",
// name regex here
"regex": "^abo",
"options": "i"
}
}
]
}
}
}
])
建议您将
phone
字段“分解”为单独的字段,以便更容易处理和格式化,如下所示:
[
{
_id: ObjectId("6616851ed50d6d1451fa8176"),
phone: {
countryCode: "7",
areaCode: "926",
number: "4585452"
},
name: "Aboba"
}
]