此问题与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*匹配.
改编自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)
| 归档时间: |
|
| 查看次数: |
959 次 |
| 最近记录: |