Mongodb查找具有特定值的文档,该文档还排除了字段值



我在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游乐场的演示。

两个快速提示:

  1. 索引无法有效地用于此谓词
  2. 您可以在find()中使用$expr(这是我在演示中使用的(,以防您不需要对其他内容使用聚合

相关内容

  • 没有找到相关文章

最新更新