我正在使用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"
}
}
}
])
操场