Mongo如何查找排除特殊字符的字段

问题描述 投票:0回答:1

我有这个 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}
mongodb mongodb-query
1个回答
0
投票

您可以创建一个名为

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"
  }
]

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.