MongoDB 聚合 - $regexMatch数组字段



我正在使用Mongo的$regexMatch运算符来查找至少部分字段与模式匹配的文档,这对于根级字段来说效果很好。但是如何将其与数组字段一起使用呢?如果至少有一个数组元素与模式匹配,我想返回匹配项。

例如,假设集合具有以下两个文档:

{
"_id": ObjectId("5ff6335c1570ba63ca5ac21e"),
"requirements": [
{
"description": "Bachelor of Science required for this blah blah blah",
"code": "ABC"
},
{
"description": "Also much experience in JavaScript blah",
"code": "XYZ"
}
]
},
{
"_id": ObjectId("5ff6335b1570ba63ca5abefb"),
"requirements": [
{
"description": "Master of Arts WANTED NOW!",
"code": "TTT"
},
{
"description": "5+ experience required in C++",
"code": "QQQ"
}
]
}

和类似这个管道的东西

db.Collection.aggregate([
{ $match:
{ $expr:
{ $regexMatch: { 
input: '$requirements.description', 
regex: /^.*?bblah blah blahb.*?$/im 
} } 
} 
}
])

应该返回第一个文档,因为它在包含"等等等等"的description匹配requirements中的第一个元素 ("这个等等等等需要理学学士学位")。

但是,这只会给我抛出一个错误,说"$regexMatch需要input字符串类型"。用$requirements[0].description替换它也不起作用。

那么有没有办法在 Mongo 中正则表达式匹配数组字段?

$regexMatch只允许字符串输入requirements具有数组 它需要迭代循环数组值,

  • $reduce迭代description循环,检查条件是否匹配则返回分数,否则返回初始值
db.collection.aggregate([
{
$addFields: {
score: {
$reduce: {
input: "$requirements.description",
initialValue: 0,
in: {
$cond: [
{
$eq: [
{
$regexMatch: {
input: "$$this",
regex: "blah blah blah"
}
},
true
]
},
50,
"$$value"
]
}
}
}
}
}
])

操场


如果你想要过滤文档,只需尝试$match阶段$regex

db.collection.aggregate([
{
$match: {
"requirements.description": {
$regex: "blah blah blah"
}
}
}
])

操场

相关内容

  • 没有找到相关文章

最新更新