MongoDB позволяет переменной не работать в агрегации конвейера - PullRequest
1 голос
/ 24 февраля 2020

Здравствуйте, я пытаюсь использовать переменную, которую я определил в 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

Надеюсь, вы сможете помочь, Испытали все безуспешно.

1 Ответ

0 голосов
/ 25 февраля 2020

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

Детская площадка

...