Како користити $лоокуп у МонгоДБ-у

МонгоДБ је популарна НоСКЛ база података која чува податке у колекцијама. МонгоДБ колекције се састоје од једног или више докумената који садрже стварне податке у ЈСОН формату. Документи су упоредиви са редовима у традиционалним релационим СКЛ базама података, док су колекције аналогне табелама.

Кључна функционалност у базама података је могућност упита података ускладиштених у бази података. Упитивање података омогућава проналажење специфичних информација, анализу података, извештавање о подацима, као и интеграцију података.

Да бисте могли ефикасно да постављате упите бази података, кључно је да будете у могућности да комбинујете податке из више табела, у случају СКЛ база података или више колекција у НОСКЛ базама података, у један скуп резултата.

У МонгоДБ $лоокуп корисници да комбинују информације из две колекције приликом постављања упита. Изводи еквивалент левог спољашњег спајања у СКЛ бази података.

Употреба и циљ $лоокуп-а

Важна функција база података је обрада података како би се из сирових података извукле значајне информације.

На пример, ако водите ресторански посао, можда ћете желети да анализирате податке свог ресторана да бисте сазнали колико зарађујете сваки дан, која храна је на захтев викендом, или чак да сазнате колико шољица кафе продајете у сваког сата у дану.

За такве потребе једноставни упити базе података неће бити довољни. Морате да извршите напредне упите о подацима које сте сачували. Да би се задовољиле такве потребе, МонгоДБ има функцију која се зове агрегациони цевовод.

Агрегациони цевовод је систем који се састоји од састављајућих операција које се називају фазе, које се користе за обраду података да би се произвео коначни збирни резултат. Примери фаза на цевоводу агрегације укључују $сорт, $матцх, $гроуп, $мерге, $цоунт и $лоокуп, између осталог.

Ове фазе се могу применити било којим редоследом у агрегационом цевоводу. У свакој фази у агрегационом цевоводу, различите операције се изводе над подацима који се преносе кроз агрегациони цевовод.

$лоокуп је стога фаза у цевоводу агрегације МонгоДБ. $Лоокуп се користи за обављање левог спољног спајања између две колекције у бази података МонгоДБ. Лево спољашње спајање комбинује све документе или уносе са леве стране са одговарајућим документима или уносима на десној страни.

На пример, размотрите две колекције испод, које су представљене у табеларном формату ради лакшег разумевања:

ордерс_цоллецтион:

ордер_идцустомер_идордер_датетотал_амоунт11002022-05-0150.0021012022-05-0275.0031022022-05-03100.00

цустомер_цоллецтион:

цустомер_нумцустомер_намецустомер_емаилцустомер_пхоне100Јохн [email protected] [email protected]

Ако извршимо лево спољно спајање на горенаведеним збиркама помоћу поља цустомер_ид, које се појављује у ордер_цоллецтион, при чему је ордер_цоллецтион лева колекција, а цустомер_цоллецтион десна колекција, резултат ће садржати све документе у колекцији налога и документе на колекцији купаца који имају цустомер_нум који се поклапа са цустомер_ид било ког од записа у колекцији поруџбина.

  Гумица за брисање приватности чисти и оптимизује ваш рачунар, безбедно уништава датотеке

Коначни резултат операције левог спољашњег спајања на колекцијама налога и купаца изгледа овако када је представљен у табеларном формату:

Обратите пажњу да за купца са цустомер_ид 101 у колекцији поруџбина, који није имао одговарајућу вредност цустомер_нум у колекцији купаца, одговарајуће вредности које недостају из табеле купаца су попуњене са нулл.

$лоокуп врши стриктно поређење једнакости између поља и преузима цео документ који се подудара, а не само поља која се подударају.

$лоокуп синтакса

Синтакса за $лоокуп је следећа:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

$лоокуп има четири параметра:

  • фром – представља колекцију из које желимо да тражимо документе. У нашем ранијем примеру користећи ордерс_цоллецтион и цустомер_цоллецтион, ставили бисмо цустомер_цоллецтион као из колекције.
  • лоцалФиелд – ово је поље у радној или примарној колекцији које користимо да упоредимо са пољима у нашој колекцији фром (у нашем случају Цустомерс_цоллецтион). У горњем примеру, лоцалФиелд би био цустомер_ид који се налази у ордерс_цоллецтион.
  • страно поље – ово је поље са којим желимо да упоредимо у колекцији из које наведемо. У нашем примеру, ово би био цустомер_нум пронађен у цустомер_цоллецтион који користимо као нашу вредност у од
  • ас – ово је ново име поља које наводимо да представља поље које ће се појавити у нашем документу, који садржи документе који су резултат подударања између локалног и страног поља. Све ове утакмице су стављене у низ у овом пољу. Ако нема подударања, ово поље ће садржати празан низ.

Из наше две раније колекције, користили бисмо следећи код да извршимо операцију $лоокуп на две колекције са ордерс_цоллецтион као нашом радном или примарном колекцијом.

{
    $lookup: {
      from: "customers_collection",
      localField: "customer_id",
      foreignField: "customer_num",
      as: "customer_info"
 }

Имајте на уму да поље ас може бити било која вредност низа. Међутим, ако му дате име које већ постоји у радном документу, то поље ће бити преписано.

Спајање података из више колекција

МонгоДБ $лоокуп је корисна фаза у цевоводу агрегације у МонгоДБ. Иако није услов да цевовод за агрегацију у МонгоДБ-у мора да има фазу $лоокуп, фаза је кључна када се изводе сложени упити који захтевају спајање података у више колекција.

Фаза $лоокуп врши лево спољно спајање на две колекције што резултира креирањем новог поља или преписивањем вредности постојећег поља низом који садржи документе из друге колекције.

  Како играти Јацкбок игре на мрежи са Зоом-ом

Ови документи се бирају на основу тога да ли имају вредности које одговарају вредностима поља са којим се упоређују. Крајњи резултат је поље које садржи низ докумената у случају да су пронађена подударања или празан низ у случају да нису пронађена подударања.

Размотрите колекције запослених и пројеката приказане у наставку.

Можемо користити следећи код да спојимо две колекције:

db.projects.aggregate([
   {
      $lookup: {
         from: "employees",
         localField: "employees",
         foreignField: "_id",
         as: "assigned_employees"
      }
   }
])

Резултат ове операције је комбинација две колекције. Резултат су пројекти и сви запослени додељени сваком пројекту. Запослени су представљени у низу.

Фазе цевовода које се могу користити заједно са $лоокупом

Као што је раније поменуто, $лоокуп је фаза у МонгоДБ агрегационом цевоводу и може се користити заједно са другим фазама цевовода агрегације. Да бисмо показали како се ове фазе могу користити заједно са $лоокупом, користићемо следеће две колекције у сврху илустрације.

У МонгоДБ-у се чувају у ЈСОН формату. Овако изгледају горње колекције у МонгоДБ-у.

Неки примери фаза цевовода агрегације који се могу користити заједно са $лоокупом укључују:

$матцх

$матцх је фаза цевовода агрегације која се користи за филтрирање тока докумената како би се дозволило да само они документи који испуњавају дати услов пређу на следећу фазу у цевоводу агрегације. Ову фазу је најбоље користити на почетку процеса за уклањање докумената који неће бити потребни и на тај начин оптимизовати цевовод за агрегацију.

Користећи две раније колекције, можете комбиновати $матцх и $лоокуп на следећи начин:

db.users.aggregate([
   {
      $match: {
         country: "USA"
      }
   },
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   }
])

$матцх се користи за филтрирање корисника из САД. Резултат од $матцх се затим комбинује са $лоокупом да би се добили детаљи поруџбине корисника из САД. Резултат горе наведене операције је приказан у наставку:

$пројецт

$пројецт је фаза која се користи за преобликовање докумената одређујући која поља треба укључити, искључити или додати документима. На пример, у случају да обрађујете документе са по десет поља, али само четири поља у документима садрже податке који су вам потребни за обраду података, можете користити $пројецт да филтрирате изван поља која вам нису потребна.

Ово вам омогућава да избегнете слање непотребних података у следећу фазу вашег агрегационог цевовода.

Можемо комбиновати $лоокуп и $пројецт овако:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $project: {
         name: 1,
         _id: 0,
         total_spent: { $sum: "$orders.price" }
      }
   }
])

Горе наведено комбинује колекције корисника и поруџбина користећи $лоокуп, а затим се $пројецт користи само за приказ имена сваког корисника и износа који је потрошио сваки корисник. $пројецт се такође користи за уклањање поља _ид из резултата. Резултат горе наведене операције је приказан у наставку:

  Које процесе можете безбедно да затворите у Монитору активности на Мац-у?

$унвинд

$унвинд је фаза агрегације која се користи за деконструисање или одмотавање поља низа креирањем нових докумената за сваки елемент у низу. Ово је корисно у случају да желите да покренете неку агрегацију вредности поља низа.

На пример, у примеру испод, у случају да желите да покренете агрегацију на пољу хобија, не можете то да урадите јер је то низ. Међутим, можете да га употребите за одмотавање помоћу $унвинд и затим извршите агрегације на резултујућим документима.

Користећи колекције корисника и поруџбина, можемо користити $лоокуп и $унвинд заједно на следећи начин:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $unwind: "$orders"
   }
])

У коду изнад, $лоокуп враћа поље низа које се зове налози. $унвинд се затим користи за одмотавање поља низа. Резултат ове операције је приказан у наставку: Приметите да се Алиса појављује два пута јер је имала два налога.

Примери случајева коришћења $лоокуп

Приликом обраде података, $лоокуп је користан алат. На пример, можда имате две колекције које желите да спојите на основу поља у збиркама које имају сличне податке. Једноставна фаза $лоокуп се може користити за ово и додавање новог поља у примарне колекције, које садрже документе добијене из друге колекције.

Узима у обзир доле приказане колекције корисника и поруџбина:

Две колекције се могу комбиновати коришћењем $лоокуп-а да би се дао резултат приказан у наставку:

$лоокуп се такође може користити за обављање сложенијих спајања. $лоокуп није ограничен само на спајање две колекције. Можете да примените више фаза $лоокуп да бисте извршили спајања на више од две колекције. Размотрите три колекције приказане у наставку:

Можемо користити код у наставку да извршимо сложеније спајање у три колекције да бисмо добили све поруџбине које су направљене, као и детаље о производима који су наручени.

Код у наставку нам омогућава да урадимо управо то:

db.orders.aggregate([
   {
      $lookup: {
         from: "order_items",
         localField: "_id",
         foreignField: "order_id",
         as: "order_items"
      }
   },
   {
      $unwind: "$order_items"
   },
   {
      $lookup: {
         from: "products",
         localField: "order_items.product_id",
         foreignField: "_id",
         as: "product_details"
      }
   },
   {
      $group: {
         _id: "$_id",
         customer: { $first: "$customer" },
         total: { $sum: "$order_items.price" },
         products: { $push: "$product_details" }
      }
   }
])

Резултат горе наведене операције је приказан у наставку:

Закључак

Када обављате обраду података која укључује више колекција, $лоокуп може бити користан јер вам омогућава да удружите податке и извучете закључке на основу података ускладиштених у више колекција. Обрада података се ретко ослања на само једну колекцију.

За извођење смислених закључака из података, спајање података у више колекција је кључни корак. Стога, размислите о коришћењу фазе $лоокуп у вашем МонгоДБ агрегационом цевоводу како бисте вам омогућили да боље обрађујете своје податке и извлачите смислене увиде из необрађених података ускладиштених у различитим збиркама.

Такође можете истражити неке МонгоДБ команде и упите.