#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 для этих внешних ключей.