匹配MongoDB中存储在字段中的正则表达式模式

Ric*_*d G 6 mongodb

此问题与MongoDB的查询功能相匹配,以匹配存储在字段中的正则表达式.

在数据库中,我存储简单的邮政编码正则表达式模式.例如,在zipcode字段中:3121, 312*, 313?

然后,如果有人输入任何匹配任何模式的字符串应该返回记录.因此用户将输入以下之一:"3121","31222","3135"并且记录应匹配并返回.这是正常的正则表达式匹配的反转.

我知道我可以在代码中单独测试每个zipcode匹配,但是可以构造一个mongoDB查询来直接处理匹配吗?

我会在此查询中添加什么?

db.shippingZones.query({}).pretty()

例如,该shippingzone文档看起来像:

{
  id: 123455678,
  states: ['NSW', 'VIC'],
  zipcodes: ['3121', '312*', '313?']
}
Run Code Online (Sandbox Code Playgroud)

然后,当用户输入'31222'时,我需要一个将返回样本文档的查询,因为正则表达式312*匹配.

Ram*_*tal 2

改编自JF对类似问题的回答

使用以下聚合管道:

  • $unwind 将数组分解zipcodes为单独的元素
  • $regexMatchzipcodes将输入与每个文档中 的值进行匹配
  • $group 对结果进行分组以重建原始文档

更复杂的聚合管道(以保留所有zipcodes

  • $addFields 将数组复制zipcodes到另一个字段copyZipCodes
  • $unwind 将数组分解copyZipCodes为单独的元素
  • $regexMatchcopyZipCodes将输入与每个文档中 的值进行匹配
  • $group 对结果进行分组,获取原始文档

管道

db.shippingZones.aggregate([
  {
    "$addFields": {
      "copyZipCodes": "$zipcodes"
    }
  },
  {
    "$unwind": "$copyZipCodes"
  },
  {
    "$match": {
      "$expr": {
        "$regexMatch": {
          "input": "31222",
          "regex": "$copyZipCodes"
        }
      }
    }
  },
  {
    "$group": {
      "_id": "$id",
      "id": {
        "$first": "$id"
      },
      "states": {
        "$first": "$states"
      },
      "zipcodes": {
        "$first": "$zipcodes"
      }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

链接到Mongo Playground