Jak používat $lookup v MongoDB

MongoDB je populární databáze NoSQL, která ukládá data do kolekcí. Kolekce MongoDB se skládají z jednoho nebo více dokumentů, které obsahují skutečná data ve formátu JSON. Dokumenty jsou srovnatelné s řádky v tradičních relačních databázích SQL, zatímco kolekce jsou analogické tabulkám.

Klíčovou funkcí v databázích je schopnost dotazovat se na data uložená v databázi. Dotazování dat umožňuje vyhledání konkrétních informací, analýzu dat, reportování dat a také integraci dat.

Aby bylo možné efektivně dotazovat databázi, je klíčové umět sloučit data z více tabulek, v případě SQL databází nebo více kolekcí v NOSQL databázích, do jedné výsledkové sady.

V MongoDB $lookup uživatelé mohou při dotazování kombinovat informace ze dvou kolekcí. Provádí ekvivalent levého vnějšího spojení v databázi SQL.

Použití a cíl $lookup

Důležitou funkcí databází je zpracování dat za účelem získání smysluplných informací z nezpracovaných dat.

Pokud například provozujete restauraci, možná budete chtít analyzovat data vaší restaurace, abyste zjistili, kolik vyděláváte každý den, která jídla jsou o víkendech na požádání, nebo dokonce zjistit, kolik šálků kávy prodáváte. každou hodinu dne.

Pro takové potřeby nebudou stačit jednoduché databázové dotazy. Musíte provádět pokročilé dotazy na data, která jste uložili. Pro řešení těchto potřeb má MongoDB funkci zvanou agregační kanál.

Agregační kanál je systém složený z operací, které lze skládat, nazývané fáze, které se používají ke zpracování dat za účelem vytvoření konečného souhrnného výsledku. Příklady fází agregačního kanálu zahrnují mimo jiné $sort, $match, $group, $merge, $count a $lookup.

Tyto fáze lze použít v libovolném pořadí v agregačním potrubí. V každé fázi agregačního kanálu se s daty procházejícími agregačním kanálem provádějí různé operace.

$lookup je tedy fází agregačního potrubí MongoDB. $Lookup se používá k provedení levého vnějšího spojení mezi dvěma kolekcemi v databázi MongoDB. Levé vnější spojení kombinuje všechny dokumenty nebo záznamy nalevo s odpovídajícími dokumenty nebo záznamy napravo.

Podívejme se například na dvě níže uvedené sbírky, které jsou pro snazší pochopení uvedeny v tabulkovém formátu:

objednávky_výběr:

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

Zákazníci_kolekce:

customer_numcustomer_namecustomer_emailcustomer_phone100John [email protected] [email protected]

Pokud provedeme levé vnější spojení na výše uvedených kolekcích pomocí pole customer_id, které se objeví v order_collection, přičemž order_collection je levá kolekce a customers_collection je pravá kolekce, bude výsledek obsahovat všechny dokumenty v kolekci Orders Collection a dokumenty. na Sbírce zákazníků, které mají customer_num, které se shoduje s customer_id kteréhokoli ze záznamů ve Sběru objednávek.

  Jak opravit nepřečtené oznámení na Instagramu, které nezmizí

Konečný výsledek operace levého vnějšího spojení na objednávkách a kolekcích zákazníků vypadá takto, když je znázorněn v tabulkovém formátu:

Všimněte si, že u zákazníka s customer_id 101 v kolekci objednávek, který neměl žádnou odpovídající hodnotu customer_num v kolekci zákazníků, byly chybějící odpovídající hodnoty z tabulky zákazníků vyplněny hodnotou null.

$lookup provádí přísné porovnání rovnosti mezi poli a načte celý dokument, který se shodoval, nejen pole, která se shodovala.

$lookup Syntaxe

Syntaxe $lookup je následující:

{
   $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 má čtyři parametry:

  • from – představuje kolekci, ze které chceme vyhledávat dokumenty. V našem dřívějším příkladu s použitím orders_collection a customers_collection bychom dali customers_collection jako z kolekce.
  • localField – toto je pole v pracovní nebo primární kolekci, které používáme k porovnání s poli v naší kolekci (v našem případě customer_collection). Ve výše uvedeném příkladu by localField bylo customer_id, které se nachází v orders_collection.
  • ForeignField – toto je pole, se kterým chceme porovnávat v kolekci, kterou specifikujeme. V našem příkladu by to bylo customer_num nalezené v customer_collection, kterou používáme jako naši hodnotu v from
  • as – toto je nový název pole, který zadáváme, aby představoval pole, které se zobrazí v našem dokumentu, který obsahuje dokumenty vyplývající ze shod mezi místním polem a cizím polem. Všechny tyto shody jsou umístěny v poli v tomto poli. Pokud neexistují žádné shody, bude toto pole obsahovat prázdné pole.

Z našich dvou dřívějších kolekcí bychom použili následující kód k provedení operace $lookup na dvou kolekcích s kolekcí orders_collection jako naší pracovní nebo primární kolekcí.

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

Všimněte si, že pole as může být libovolná řetězcová hodnota. Pokud mu však dáte název, který již v pracovním dokumentu existuje, bude toto pole přepsáno.

Spojení dat z více kolekcí

MongoDB $lookup je užitečná fáze v agregačním kanálu v MongoDB. Ačkoli není požadavkem, aby agregační kanál v MongoDB musel mít fázi $lookup, tato fáze je klíčová při provádění složitých dotazů, které vyžadují spojení dat napříč více kolekcemi.

Fáze $lookup provádí levé vnější spojení dvou kolekcí, což má za následek vytvoření nového pole nebo přepsání hodnot existujícího pole polem obsahujícím dokumenty z jiné kolekce.

  8 nejlepších doplňků pro Tabulky Google pro analýzu kmenových dat [2023]

Tyto dokumenty jsou vybírány podle toho, zda mají hodnoty, které odpovídají hodnotám pole, se kterým jsou porovnávány. Konečným výsledkem je pole obsahující pole dokumentů v případě, že byly nalezeny shody, nebo prázdné pole v případě, že nebyly nalezeny žádné shody.

Zvažte níže uvedené sbírky zaměstnanců a projektů.

Ke spojení dvou kolekcí můžeme použít následující kód:

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

Výsledkem této operace je kombinace dvou kolekcí. Výsledkem jsou projekty a všichni zaměstnanci přiřazení ke každému projektu. Zaměstnanci jsou zastoupeni v poli.

Stupně potrubí, které lze použít společně s $lookup

Jak již bylo zmíněno, $lookup je fáze v agregačním kanálu MongoDB a lze jej použít společně s dalšími fázemi agregačního potrubí. Abychom ukázali, jak lze tyto fáze použít spolu s $lookup, použijeme pro ilustraci následující dvě kolekce.

V MongoDB jsou uloženy ve formátu JSON. Takto vypadají výše uvedené kolekce v MongoDB.

Některé příklady fází agregačního kanálu, které lze použít společně s $lookup, zahrnují:

$match

$match je fáze agregačního kanálu, která se používá k filtrování toku dokumentů, aby do další fáze agregačního kanálu mohly postoupit pouze ty dokumenty, které splňují danou podmínku. Tato fáze se nejlépe využije na začátku procesu k odstranění dokumentů, které nebudou potřeba, a tím k optimalizaci agregačního kanálu.

Pomocí dvou předchozích kolekcí můžete kombinovat $match a $lookup takto:

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

$match se používá k filtrování uživatelů z USA. Výsledek z $match je pak kombinován s $lookup, aby se získaly podrobnosti o objednávce uživatelů z USA. Výsledek výše uvedené operace je uveden níže:

$projekt

$project je fáze používaná k přetváření dokumentů určením, která pole se mají zahrnout, vyloučit nebo přidat do dokumentů. Například v případě, že zpracováváte dokumenty s deseti poli, ale pouze čtyři pole v dokumentech obsahují data, která potřebujete pro zpracování dat, můžete použít $project k odfiltrování polí, která nepotřebujete.

To vám umožní vyhnout se odesílání zbytečných dat do další fáze agregačního kanálu.

Můžeme kombinovat $lookup a $project takto:

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

Výše uvedené kombinuje uživatele a sbírky objednávek pomocí $lookup, poté se $project používá pouze k zobrazení jména každého uživatele a částky utracené každým uživatelem. $project se také používá k odstranění pole _id z výsledků. Výsledek výše uvedené operace je uveden níže:

  Jak restartovat vzdálený počítač? (Příkaz + Nástroje)

$uvolněte se

$unwind je agregační fáze používaná k dekonstruování nebo odvíjení pole pole, které vytváří nové dokumenty pro každý prvek v poli. To je užitečné v případě, že chcete spustit nějakou agregaci hodnot polí pole.

Například v níže uvedeném příkladu v případě, že chcete spustit agregaci na poli koníčků, nemůžete tak učinit, protože se jedná o pole. Můžete jej však použít rozbalit pomocí $unwind a poté provést agregace na výsledných dokumentech.

Pomocí kolekcí uživatelů a objednávek můžeme společně používat $lookup a $unwind takto:

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

Ve výše uvedeném kódu vrací $lookup pole pole s názvem orders. $unwind se pak používá k rozbalení pole pole. Výsledek této operace je uveden níže: Všimněte si, že se Alice objeví dvakrát, protože měla dvě objednávky.

Příklady případů použití $lookup

Při zpracování dat je užitečný nástroj $lookup. Můžete mít například dvě kolekce, které chcete spojit, na základě polí v kolekcích, které mají podobná data. K tomu lze použít jednoduchou fázi $lookup a přidat nové pole do primárních kolekcí, které obsahují dokumenty získané z jiné kolekce.

Bere v úvahu níže uvedené kolekce uživatelů a objednávek:

Tyto dvě kolekce lze zkombinovat pomocí $lookup a získat výsledek uvedený níže:

$lookup lze také použít k provádění složitějších spojení. $lookup se neomezuje pouze na provádění spojení dvou kolekcí. Můžete implementovat více fází $lookup pro provedení spojení na více než dvou kolekcích. Zvažte tři níže uvedené kolekce:

Níže uvedený kód můžeme použít k provedení složitějšího spojení napříč třemi kolekcemi, abychom získali všechny objednávky, které byly provedeny, a také podrobnosti o produktech, které byly objednány.

Níže uvedený kód nám to umožňuje:

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

Výsledek výše uvedené operace je uveden níže:

Závěr

Při zpracování dat zahrnujících více kolekcí může být $lookup užitečný, protože vám umožňuje spojovat data a vyvozovat závěry na základě dat uložených ve více kolekcích. Zpracování dat zřídka závisí pouze na jednom sběru.

Chcete-li z dat vyvodit smysluplné závěry, je klíčovým krokem spojení dat z více kolekcí. Zvažte proto využití fáze $lookup ve vašem agregačním kanálu MongoDB, která vám umožní lépe zpracovávat vaše data a čerpat smysluplné poznatky z nezpracovaných dat uložených napříč kolekcemi.

Můžete také prozkoumat některé příkazy a dotazy MongoDB.