我在mongodb上搜索了一个大集合。(支持PCRE v8.42(
比方说,我正在努力寻找";评论";包含";阿尔法布拉沃";其中字段值";name";不会立即跟随
换句话说,匹配$regex:"alpha bravo(?!"$name(";
示例:
Doc1
"name": "john"
"comment": "alpha; alpha lima alpha bravo golf"
#this should match
Doc2
"name": "fonz"
"comment": "foxtrot alpha bravo fonz; zulu"
#this shouldn't match
Doc3
"name": "zoltan"
"comment": "golf alpha bravo zoltan; alpha bravo delta; lambda alpha"
#this should match due to alpha bravo delta
通常,我会尝试使用regex来实现这一点,但我无法将其与静态值和字段值混合使用。
我尝试了以下方法,但没有成功。
"$regex": "alpha bravo (?!"$name")"
我尝试过用match后跟expr进行聚合,如果我在regex字段中单独调用字段值,但不能与静态值组合使用,至少可以与我尝试过的函数组合使用。
db.collection.aggregate({
"$match": {
"$expr": {
"$regexMatch": {
"input": "$comment",
"regex": "alpha bravo (?!"$name")"
}
}
}
})
我收到的错误是regex表达式无效或缺少右括号或引号。
避开赛场上的双重报价也无济于事。
提前感谢您的帮助!
使用"$concat"
构建"regex"
来扩展"$regexMatch"
的想法似乎是可行的。
db.collection.aggregate([
{
"$match": {
"$expr": {
"$regexMatch": {
"input": "$comment",
"regex": {"$concat": ["alpha bravo (?!", "$name", ")"]}
}
}
}
}
])
在mongoplayground.net上试试。
有趣的问题。看起来@rickhg12hs以2分钟的优势击败了我,但无论如何,我都会分享这一点,主要是为了我在底部添加的两个附加注释。尽管如此,请随意接受他们的!
看起来你已经完成了90%的任务。缺少的部分是用$concat
运算符包装$regex
值,例如:
$expr: {
$regexMatch: {
input: "$comment",
regex: {
$concat: [
"alpha bravo (?!",
"$name",
")"
]
}
}
}
这是Mongo游乐场的演示。
两个快速提示:
- 索引无法有效地用于此谓词
- 您可以在
find()
中使用$expr
(这是我在演示中使用的(,以防您不需要对其他内容使用聚合