regex - MongoDB:是否有可能将包含正则表达式的字段与聚合管道中 $match 阶段的字符串进行匹配?
问题描述
我目前正在尝试通过使用聚合管道来优化一些查询。现在我想要一个 $match 阶段来过滤掉大部分集合文档,以加快后续阶段的速度。我面临的问题是集合中的文档确实包含表示正则表达式的字段。我现在想根据这些正则表达式匹配字符串(最好在第一个 $match 阶段)。
这就是我当前的解决方案的外观。但就可读性和可能的性能而言,我对此并不满意。
[
{$match: {
name: "docName"
}
},
{$addFields: {
fieldAMatches: {$regexMatch: {input: "ABC", regex: '$fieldA'
}
}
}
},
{$match: {
fieldAMatches: true
}
}
]
示例数据集如下所示:
[
{
"_id": 1,
"name": "docName",
"fieldA": ".*"
},
{
"_id": 2,
"name": "docName",
"fieldA": "AB.*"
},
{
"_id": 3,
"name": "docName",
"fieldA": "AB.+"
},
{
"_id": 4,
"name": "docName",
"fieldA": "BAC"
}
]
结果包含以下文件:
[
{
"_id": 1,
"name": "docName",
"fieldA": ".*"
},
{
"_id": 2,
"name": "docName",
"fieldA": "AB.*"
},
{
"_id": 3,
"name": "docName",
"fieldA": "AB.+"
},
]
解决方案
您可以使用$expr来实现这一点,来自文档:
$match 接受一个指定查询条件的文档。查询语法与读操作查询语法相同;即 $match 不接受原始聚合表达式。相反,使用 $expr 查询表达式在 $match 中包含聚合表达式。
通过使用$expr
,我们可以在 stage 中包含聚合表达式(在我们的例子$regexMatch
中),$match
如下所示:
db.collection.aggregate([
{
$match: {
name: "docName",
$expr: {
$regexMatch: {
input: "ABC",
regex: "$fieldA"
}
}
}
}
])
推荐阅读
- powerbi - 在具有多个过滤器的 DAX 中使用 SUMX 函数。适用于字符串常量但不适用于变量
- javascript - firebase.firestore.Timestamp.fromDate() 未定义
- python - 按特定顺序对数据框中的值进行排序和排列
- c# - 如何将图像接收到 xamarin android?
- r - 在 R 中使用 dplyr 按组计算平均值
- firebase - firebase glob 匹配根目录和所有目录
- java - 当我写关键字时,它没有在 android studio 中显示任何选项
- apache-superset - 有没有办法锁定查询并只允许用户更改参数?
- php - 如何修复数量输入字段不影响单个产品页面woocommerce上的其他数量输入字段?
- c# - EF Core 自动将 ulong 转换为 long