поиск-совпадение mongodb в качестве второго шага конвейера - PullRequest
0 голосов
/ 12 сентября 2018

Я относительно новичок в агрегации mongodb, и у меня есть крошечная проблема:

Я хочу объединить две коллекции. Проблема в том, что внешнее поле помещается во внутренний массив. Это означает, что мне нужно развернуть массив, чтобы получить правильное соответствие $. В моем $ match я использую $ epxr и $ eq, чтобы объединить ненужные документы (что не является проблемой). $ Expr необходим для доступа к переменным из оригинальной коллекции:

[
  ...
  {
    $lookup: {
      from: 'foreignCollection',
      as: 'field',
      let: {
        localField: '$someComparisonField'
      },
      pipeline: [
        {
          $unwind: '$arr'
        },
        {
          $match: {
            $expr: {
              $eq: [ '$arr.foreignField', '$$localField' ]
            }
          }
        }
      ]
    }
  }
]

Однако field всегда является пустым массивом в моем наборе результатов. Я серьезно не знаю, что я делаю не так: D

Может ли кто-нибудь мне помочь?

Edit: В соответствии с запросом, некоторые образцы данных для двух участвующих коллекций:

orginalCollection:

{
  ...
  someComparisonField: 1
},
{
  ...
  someComparisonField: 2
}

foreignCollection:

{
  ...
  arr: [
    {
      ...
      foreignField: 1
    },
    {
      ...
      foreignField: 1
    },
    {
      ...
      foreignField: 2
    },
  ]
},
{
  ...
  arr: [
    {
      ...
      foreignField: 1
    },
    {
      ...
      foreignField: 2
    },
    {
      ...
      foreignField: 2
    },
  ]
},
{
  ...
  arr: [
    {
      ...
      foreignField: 2
    },
    {
      ...
      foreignField: 1
    },
    {
      ...
      foreignField: 2
    },
  ]
},

Редактировать 2:

Я забыл добавить небольшую деталь: с $ eq во внутреннем конвейере я получаю доступ к фиксированному индексу, который означает, что foreignField на самом деле выглядит так: foreignField: [ <value> ].

1 Ответ

0 голосов
/ 13 сентября 2018

С некоторым исследованием я пришел к следующему выводу:

Прежде чем читать дальше, я рекомендую прочитать оба моих исправления к вопросам. Особенно мое второе редактирование.

Кажется, что $ eq в пределах $ expr просто не может сравнить фиксированный индекс.

Это выражение просто как-то не работает:

{
  $expr: {
    $eq: [ '$arr.foreignField.0': '$$localField' ]
  }
}

Чтобы обойти это, перед этим этапом я создал проекцию, которая извлекает значение из требуемого фиксированного индекса и сохраняет его в новом поле. Так что теперь отдельные этапы из внутреннего конвейера выглядят так:

...
{
  $project: {
    value: { $arrayElemAt: [ '$arr.foreignField', 0 ] }
  }
},
{ 
  $match: {
    $expr: {
      $eq: [ '$value', '$$localField' ]
    }
  }
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...