MongoDB 让变量在管道聚合中不起作用

问题描述 投票:0回答:2

嗨,我正在尝试使用我在 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

希望能帮到你, 已经尝试了所有方法都没有成功。

database mongodb variables pipeline let
2个回答
1
投票

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"
  }}
])

游乐场


0
投票

在 $match 中使用变量时也有类似的问题: 在 $match 中像这样使用它

dateFrom: {
  $lte: '$$coverageFrom',
},

这失败了,因为

$$coverageFrom
没有获得值。

这样解决:

$expr: {
    $lte: ["dateFrom", "$$coverageFrom"]
}

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.