Cum să utilizați $lookup în MongoDB

MongoDB este o bază de date populară NoSQL care stochează date în colecții. Colecțiile MongoDB sunt compuse din unul sau mai multe documente care conțin datele reale în format JSON. Documentele sunt comparabile cu rândurile din bazele de date SQL relaționale tradiționale, în timp ce colecțiile sunt analoge cu tabelele.

O funcționalitate cheie în bazele de date este capacitatea de a interoga datele stocate în baza de date. Interogarea datelor permite regăsirea unor informații specifice, analiza datelor, raportarea datelor și, de asemenea, integrarea datelor.

Pentru a putea interoga eficient o bază de date, este esențial să puteți combina datele din mai multe tabele, în cazul bazelor de date SQL sau a colecțiilor multiple din bazele de date NOSQL, într-un singur set de rezultate.

În MongoDB, utilizatorii $lookup să combine informații din două colecții atunci când interogează. Realizează echivalentul unei îmbinări exterioare stângi într-o bază de date SQL.

Utilizarea și obiectivul $lookup

O funcție importantă a bazelor de date este procesarea datelor pentru a obține informații semnificative din datele brute.

De exemplu, dacă conduceți o afacere de restaurant, poate doriți să analizați datele restaurantului dvs. pentru a afla cât câștigați în fiecare zi, ce alimente sunt la cerere în weekend sau chiar să aflați la câte cești de cafea vindeți. fiecare oră a zilei.

Pentru astfel de nevoi, interogările simple ale bazei de date nu vor fi suficiente. Trebuie să efectuați interogări avansate asupra datelor pe care le-ați stocat. Pentru a răspunde unor astfel de nevoi, MongoDB are o caracteristică numită conductă de agregare.

O conductă de agregare este un sistem compus din operațiuni componabile numite etape, care sunt utilizate pentru a procesa date pentru a produce un rezultat final agregat. Exemplele de etape ale conductei de agregare includ $sort, $match, $group, $merge, $count și $lookup, printre altele.

Aceste etape pot fi aplicate în orice ordine într-o conductă de agregare. În fiecare etapă a unei conducte de agregare, sunt efectuate diferite operații asupra datelor care sunt trecute prin conducta de agregare.

$lookup este astfel o etapă în conducta de agregare MongoDB. $Lookup este folosit pentru a efectua o îmbinare exterioară stângă între două colecții dintr-o bază de date MongoDB. O îmbinare exterioară stângă combină toate documentele sau intrările din stânga cu documentele sau intrările care se potrivesc din dreapta.

De exemplu, luați în considerare cele două colecții de mai jos, care au fost reprezentate în format tabel pentru o înțelegere mai ușoară:

colectare_comenzi:

order_idcustomer_idorder_datetotal_amount11002022-05-0150.0021012022-05-0275.0031022022-05-03100.00

colecție_clienți:

customer_numcustomer_namecustomer_emailcustomer_phone100John [email protected] [email protected]

Dacă efectuăm o îmbinare exterioară stângă pe colecțiile de mai sus folosind câmpul customer_id, care apare în order_collection, cu order_collection fiind colecția din stânga și customers_collection fiind colecția corectă, rezultatul va conține toate documentele din Colectia Comenzi și documentele în Colecția Clienți care au un customer_num care se potrivește cu customer_id din oricare dintre înregistrările din Colecția Comenzi.

  13 cele mai bune jocuri zombie PS3 din toate timpurile

Rezultatul final al operațiunii de îmbinare exterioară stângă a comenzilor și colecțiilor clienților arată astfel când este reprezentat în format tabel:

Observați că pentru clientul cu customer_id 101 în colecția de comenzi, care nu avea o valoare customer_num corespunzătoare în colecția de clienți, valorile corespunzătoare lipsă din tabelul clienți au fost completate cu nul.

$lookup efectuează o comparație strictă de egalitate între câmpuri și preia întregul document care s-a potrivit, și nu doar câmpurile care s-au potrivit.

Sintaxă $lookup

Sintaxa pentru $lookup este următoarea:

{
   $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 are patru parametri:

  • din – reprezintă colecția din care dorim să căutăm documente. În exemplul nostru anterior, folosind orders_collection și customers_collection, am pune customers_collection ca din colecție.
  • localField – acesta este un câmp din colecția de lucru sau primară pe care îl folosim pentru a compara cu câmpurile din colecția noastră (customers_collection în cazul nostru). În exemplul de mai sus, localField ar fi customer_id care se găsește în orders_collection.
  • foreignField – acesta este câmpul cu care vrem să comparăm în colecția din care specificăm. În exemplul nostru, acesta ar fi numărul_client găsit în colecția_client pe care o folosim ca valoare din
  • as – acesta este un nou nume de câmp pe care îl specificăm pentru a reprezenta câmpul care va apărea în documentul nostru, care conține documente rezultate din potriviri între localField și foreignField. Toate aceste potriviri sunt puse într-o matrice în acest câmp. Dacă nu există potriviri, acest câmp va conține o matrice goală.

Din cele două colecții anterioare, am folosi următorul cod pentru a efectua o operație $lookup pe cele două colecții cu orders_collection ca colecție de lucru sau principală.

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

Rețineți că câmpul as poate fi orice valoare șir. Cu toate acestea, dacă îi dați un nume care există deja în documentul de lucru, acel câmp va fi suprascris.

Asocierea datelor din mai multe colecții

MongoDB $lookup este o etapă utilă într-o conductă de agregare în MongoDB. Deși nu este o cerință ca o conductă de agregare în MongoDB să aibă o etapă $lookup, etapa este crucială atunci când se efectuează interogări complexe care necesită îmbinarea datelor în mai multe colecții.

Etapa $lookup realizează o îmbinare exterioară stângă pe două colecții, ceea ce duce la crearea unui câmp nou sau la suprascrierea valorilor unui câmp existent cu o matrice care conține documente dintr-o altă colecție.

Aceste documente sunt selectate în funcție de dacă au valori care se potrivesc cu valorile câmpului cu care sunt comparate. Rezultatul final este un câmp care conține o serie de documente în cazul în care au fost găsite potriviri sau o matrice goală în cazul în care nu au fost găsite potriviri.

  15 cele mai bune portofele fără custodie de folosit în 2023

Luați în considerare colecțiile angajaților și ale proiectelor prezentate mai jos.

Putem folosi următorul cod pentru a uni cele două colecții:

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

Rezultatul acestei operațiuni este o combinație a celor două colecții. Rezultatul sunt proiectele și toți angajații alocați fiecărui proiect. Angajații sunt reprezentați într-o matrice.

Etape pipeline care pot fi utilizate împreună cu $lookup

După cum am menționat anterior, $lookup este o etapă dintr-o conductă de agregare MongoDB și poate fi utilizat împreună cu alte etape ale conductei de agregare. Pentru a arăta cum aceste etape pot fi utilizate împreună cu $lookup, vom folosi următoarele două colecții în scop ilustrativ.

În MongoDB, acestea sunt stocate în format JSON. Așa arată colecțiile de mai sus în MongoDB.

Câteva exemple de etape ale conductei de agregare care pot fi utilizate împreună cu $lookup includ:

$match

$match este o etapă a conductei de agregare utilizată pentru a filtra fluxul de documente pentru a permite doar acelor documente care îndeplinesc condiția dată să treacă la următoarea etapă din conducta de agregare. Această etapă este cel mai bine utilizată la începutul procesului pentru a elimina documentele care nu vor fi necesare și, astfel, pentru a optimiza conducta de agregare.

Folosind cele două colecții anterioare, puteți combina $match și $lookup astfel:

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

$match este folosit pentru a filtra utilizatorii din SUA. Rezultatul de la $match este apoi combinat cu $lookup pentru a obține detaliile comenzii utilizatorilor din SUA. Rezultatul operațiunii de mai sus este prezentat mai jos:

$proiect

$project este o etapă folosită pentru a remodela documente prin specificarea câmpurilor care trebuie incluse, excluse sau adăugate documentelor. De exemplu, în cazul în care procesați documente cu zece câmpuri fiecare, dar numai patru câmpuri din documente conțin date de care aveți nevoie pentru prelucrarea datelor dvs., puteți utiliza $project pentru a filtra câmpurile de care nu aveți nevoie.

Acest lucru vă permite să evitați trimiterea de date inutile la următoarea etapă a conductei de agregare.

Putem combina $lookup și $project astfel:

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

Cele de mai sus combină colecțiile utilizatorilor și comenzilor folosind $lookup, apoi $project este folosit pentru a afișa numai numele fiecărui utilizator și suma cheltuită de fiecare utilizator. $project este folosit și pentru a elimina câmpul _id din rezultate. Rezultatul operațiunii de mai sus este prezentat mai jos:

  Top Call Center 📞Software de automatizare pentru interacțiunea eficientă a echipei

$destinde

$unwind este o etapă de agregare folosită pentru a deconstrui sau a derula un câmp de matrice creând noi documente pentru fiecare element din matrice. Acest lucru este util în cazul în care doriți să rulați o agregare pe valorile câmpului matrice.

De exemplu, în exemplul de mai jos, în cazul în care doriți să rulați agregarea în câmpul hobby-uri, nu puteți face acest lucru deoarece este o matrice. Cu toate acestea, puteți utiliza unwind-l folosind $unwind și apoi efectuați agregari pe documentele rezultate.

Folosind colecțiile de utilizatori și comenzi, putem folosi $lookup și $unwind împreună astfel:

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

În codul de mai sus, $lookup returnează un câmp matrice numit ordine. $unwind este apoi folosit pentru a derula câmpul matricei. Rezultatul acestei operațiuni este prezentat mai jos: Observați că Alice apare de două ori pentru că a avut două comenzi.

Exemple de cazuri de utilizare $lookup

Când efectuați procesarea datelor, $lookup este un instrument util. De exemplu, este posibil să aveți două colecții la care doriți să vă alăturați pe baza câmpurilor din colecțiile care au date similare. O etapă simplă $lookup poate fi folosită pentru a face acest lucru și pentru a adăuga un câmp nou în colecțiile primare, care conțin documente obținute dintr-o altă colecție.

Ia în considerare colecțiile de utilizatori și comenzi prezentate mai jos:

Cele două colecții pot fi combinate folosind $lookup pentru a da rezultatul prezentat mai jos:

$lookup poate fi folosit și pentru a efectua îmbinări mai complexe. $lookup nu se limitează doar la realizarea adunării pe două colecții. Puteți implementa mai multe etape $lookup pentru a efectua îmbinări pe mai mult de două colecții. Luați în considerare cele trei colecții prezentate mai jos:

Putem folosi codul de mai jos pentru a efectua o îmbinare mai complexă între cele trei colecții pentru a obține toate comenzile care au fost efectuate și, de asemenea, detalii despre produsele care au fost comandate.

Codul de mai jos ne permite să facem exact asta:

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" }
      }
   }
])

Rezultatul operațiunii de mai sus este prezentat mai jos:

Concluzie

Atunci când efectuați procesarea datelor care implică mai multe colecții, $lookup poate fi util, deoarece vă permite să asociați date și să trageți concluzii pe baza datelor stocate în mai multe colecții. Prelucrarea datelor se bazează rar pe o singură colecție.

Pentru a trage concluzii semnificative din date, unirea datelor în mai multe colecții este un pas cheie. Prin urmare, luați în considerare utilizarea etapei $lookup în conducta dvs. de agregare MongoDB pentru a vă permite să vă procesați mai bine datele și să obțineți informații semnificative din datele brute stocate în colecții.

De asemenea, puteți explora unele comenzi și interogări MongoDB.