Условие из коллекции при поиске $ в агрегации MongoDB

#mongodb #mongodb-query #aggregation-framework

#mongodb #mongodb-запрос #агрегация-фреймворк

Вопрос:

Допустим, у меня есть четыре коллекции: Main коллекция и три других A , B и C

Основная коллекция имеет foreignKey поле, которое указывает на запись в любом A B или C , в зависимости от поля type :

 Main
{_id: 1, foreignKey: 1, type: "TypeA"},
{_id: 2, foreignKey: 2, type: "TypeA"},
{_id: 3, foreignKey: 1, type: "TypeB"},
{_id: 4, foreignKey: 1, type: "TypeC"}


A
{_id: 1, otherData: "asdf"},
{_id: 2, otherData: "qwer"}

B
{_id: 1, otherData: "hello"},

C
{_id: 1, otherData: "world"}
  

Я хочу выполнить объединение, используя $lookup внутри агрегации. Есть ли способ заставить from поле зависеть от значения type field ?

Результат в этом примере будет:

 {_id: 1, foreignKey: 1, type: "TypeA", rest: {_id: 1, otherData: "asdf"}},
{_id: 2, foreignKey: 2, type: "TypeA", rest: {_id: 1, otherData: "qwer"}},
{_id: 3, foreignKey: 1, type: "TypeB", rest: {_id: 1, otherData: "hello"}},
{_id: 4, foreignKey: 1, type: "TypeC", rest: {_id: 1, otherData: "world"}}
  

Ответ №1:

Я не знаю, хорошо ли я понял, но… вы это имеете в виду?

 db.Main.aggregate([
  {
    "$match": {
      "type": "TypeC"
    }
  },
  {
    "$lookup": {
      "from": "C",
      "localField": "foreignKey",
      "foreignField": "_id",
      "as": "output"
    }
  }
])
  

Сделайте $lookup только с тем типом, который вы хотите, вместо всех типов.

Пример здесь.

Без $match этапа вывод содержит все типы (пример)

Комментарии:

1. Спасибо. Почти готово. Я хочу это, но для каждого типа. Например, выполнить три сопоставления и объединить результаты, скажем

Ответ №2:

Вы не можете сделать from в $lookup динамическим. Что вы можете сделать здесь, так это выполнить 3 этапа поиска для каждой коллекции (A, B, C), а затем на следующем этапе проектирования вы узнаете, из какого поля принимать значение на основе вашего свойства «type». Что вы также можете сделать для обеспечения хорошей производительности, так это создать индексы в коллекциях A, B и C для этих внешних ключей.