0

Не могли бы вы помочь мне с агрегацией mongoDB. Вот что я хотел бы сделать дальше:Структура агрегации Mongo по большим данным

У меня есть коллекция A. Документ из A представляет объект как:

{ 
    nameA: 'first', 
    items: [ 
    'item1', 
    'item2', 
    'item3', 
    'item4' 
    ] 
} 

И у меня есть коллекция B с документами, как:

[ 
    { 
     item: 'item3', 
     info: 'info1' 
    }, 
    { 
     item: 'item3', 
     info: 'info2' 
    }, 
    { 
     item: 'item3', 
     info: 'info3' 
    } 
] 

Я работаю с большими данными, так что было бы лучше сделать это в одном запросе , Представьте, что у нас уже есть все данные из коллекции А. Я хотел бы создать запрос на коллекцию B, чтобы получить следующий результат структуры:

{ 
    'first'/*nameA*/: ['info1', 'info2', 'info3'], 
    .... 
} 

Как достичь желаемого результата с агрегацией MongoDB?

+0

Это не очень полезно дизайн, обратите внимание, что Монго не позволяет соединения, есть $ поиск для управления подобно левому соединению, вы можете проверить документацию для $ lookup в конвейере агрегации. –

ответ

1

Как отметил Рахул Кумар в своем комментарии, ваш дизайн больше склоняется к дизайну схемы реляционной базы данных, и это создает трудности для разработки эффективного MongoDB.

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

db.A.aggregate([ 
    { 
     $unwind: { 
      path: "$items" 
     } 
    }, 
    { 
     $lookup: { 
      from: "B", 
      localField: "items", 
      foreignField: "item", 
      as: "item_info" 
     } 
    }, 

    { 
     $unwind: { 
      path: "$item_info" 
     } 
    }, 

    { 
     $group: { 
      _id: "$nameA", 
      item_info: { $addToSet: "$item_info.info" } 
     } 
    } 
]); 
  1. В первом $unwind этапе вы нормализуют items массив на collection A для того, чтобы передать его выход на следующий этап

  2. В th е $lookup этапе вы сделаете левое соединение между двумя коллекциями , которые являются частью одной и той же базе данных, в данном случае используется для получения информации о элемента из collection B

  3. Во втором $unwind этапе вы нормализации данных, извлеченный из collection B для того, чтобы сгладить массив, содержащий объекты collection B, которые были сопоставлены с соответствующими элементов в collection A

  4. Наконец, в $group этапе вы группа все записи результата nameA и создать массив уникальной информации об объекте значений. Если вы хотите, чтобы все повторяющиеся вхождения значения информации о позиции, вы можете заменить аккумулятор $addToSet на $push.

Ниже приведен результат выполнения выше агрегирования трубопровода на коллекции, которые вы предоставили:

{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] } 
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] } 
+0

Yep :) Я понимаю, что было бы лучше использовать дизайн схемы реляционной базы данных, но он уже написан.Очень ценю вашу помощь! Большое спасибо! –

Смежные вопросы