嗨,我正在尝试使用我在 let 中定义的变量用于匹配查找,但使用正则表达式时它不会返回任何结果:
它的工作原理如下:
db.MSP_Prosper.aggregate([
{ $match: {Cleavage_score: {$gte:0.7}}},
{ $lookup: {
from:"Uniprot_New_Entries",
let: { order_item: new RegExp('.*' + "P62258" + '.*')},
pipeline: [{
$match: { Uniprot_AC : new RegExp('.*' + "P62258" + '.*')
}},
{ $project: { _id: 0,
test: "$$order_item",
date: { name: "$Uniprot_ID",
date: "$Min_Max_Of_the_Ft_chain"}
}
}],
as:"cleavage_sites"
}
}
])
但当我尝试使用 let 函数中定义的相同变量时则不然:
db.MSP_Prosper.aggregate([
{$match: {Cleavage_score: {$gte:0.7}}},
{
$lookup: { from:"Uniprot_New_Entries",
let: { order_item: new RegExp('.*' + "P62258" + '.*')},
pipeline: [
{ $match:
{ Uniprot_AC : "$$order_item" }
},
{ $project: { _id: 0,
test: "$$order_item",
date: { name: "$Uniprot_ID",
date: "$Min_Max_Of_the_Ft_chain"}
}},
],
as:"cleavage_sites"
}
}
])
最终我想用局部变量替换“P62258” $Protein_ID
希望能帮到你, 已经尝试了所有方法都没有成功。
new RegExp
在客户端中计算并作为绝对值包含在查询中,因此您不能以这种方式包含依赖于文档的变量。
要将文档字段用作查找管道内的正则表达式,您需要将
$expr
子句与 $regexMatch
聚合运算符结合使用。请注意,搜索字符串前后的 .*
是隐含的,因此不必要。
类似:
db.MSP_Prosper.aggregate([
{ $match: { Cleavage_score: { $gte: 0.7 } } },
{ $lookup: {
from: "Uniprot_New_Entries",
let: { "order_item": "$Protein_ID" },
pipeline: [
{$match: {
$expr: {
$regexMatch: {
input: "$Uniprot_AC",
regex: "$$order_item"
}}}},
{$project: {
_id: 0,
test: "$$order_item",
date: {
name: "$Uniprot_ID",
date: "$Min_Max_Of_the_Ft_chain"
}}},
],
as: "cleavage_sites"
}}
])
在 $match 中使用变量时也有类似的问题: 在 $match 中像这样使用它
dateFrom: {
$lte: '$$coverageFrom',
},
这失败了,因为
$$coverageFrom
没有获得值。
这样解决:
$expr: {
$lte: ["dateFrom", "$$coverageFrom"]
}
希望这有帮助。