Úvod do Morphia - Java ODM pre MongoDB

1. Prehľad

V tomto tutoriále pochopíme, ako používať Morphia, Object Document Mapper (ODM) pre MongoDB v Jave.

V tomto procese tiež pochopíme, čo je ODM a ako uľahčuje prácu s MongoDB.

2. Čo je to ODM?

Pre nezainteresovaných v tejto oblasti MongoDB je dokumentovo orientovaná databáza vytvorená na prirodzenú distribúciu. Zjednodušene povedané, dokumentárne databázy spravujú dokumenty, ktoré nie sú ničím iným bez schémy spôsob organizácie pološtruktúrovaných údajov. Spadajú pod širšiu a voľne definovanú strechu databáz NoSQL, pomenovaných podľa zjavného odklonu od tradičnej organizácie databáz SQL.

MongoDB poskytuje ovládače pre takmer všetky populárne programovacie jazyky, ako je Java. Tieto ovládače ponúkajú vrstvu abstrakcie pre prácu s MongoDB, takže nepracujeme priamo s protokolom Wire. Predstavte si to ako Oracle, ktoré poskytuje implementáciu ovládača JDBC pre svoju relačnú databázu.

Ak si však spomenieme na naše dni práce s JDBC priamo, môžeme oceniť, aké chaotické to môže byť - najmä v objektovo orientovanej paradigme. Našťastie máme na záchranu rámce Object Relational Mapping (ORM) ako Hibernate. Pre MongoDB sa to veľmi nelíši.

Aj keď určite môžeme pracovať s nízkoúrovňovým ovládačom, na splnenie úlohy je potrebných oveľa viac pracovných síl. Tu máme podobný koncept ako ORM s názvom Object Document Mapper (ODM). Morphia presne vyplňuje tento priestor pre programovací jazyk Java a pracuje nad ovládačom Java pre MongoDB.

3. Nastavenie závislostí

Videli sme dosť teórie, aby sme sa dostali do nejakého kódu. Pre naše príklady vymodelujeme knižnicu kníh a uvidíme, ako ju môžeme spravovať v MongoDB pomocou Morphie.

Než však začneme, budeme musieť nastaviť niektoré zo závislostí.

3.1. MongoDB

Potrebujeme mať spustenú inštanciu MongoDB, s ktorou môžeme pracovať. Existuje niekoľko spôsobov, ako to získať, a najjednoduchšie je stiahnuť a nainštalovať komunitné vydanie na našom lokálnom počítači.

Mali by sme nechať všetky predvolené konfigurácie tak, ako sú, vrátane portu, na ktorom beží MongoDB.

3.2. Morfia

Môžeme si stiahnuť vopred pripravené súbory JAR pre Morphiu z Maven Central a použiť ich v našom projekte Java.

Najjednoduchším spôsobom je však použiť nástroj na správu závislostí, ako je Maven:

 dev.morphia.morphia jadro 1.5.3 

4. Ako sa pripojiť pomocou Morphia?

Teraz, keď máme nainštalovaný a spustený MongoDB a máme v našom projekte Java nastavenú Morphiu, sme pripravení sa pripojiť k MongoDB pomocou Morphie.

Pozrime sa, ako to môžeme dosiahnuť:

Morphia morphia = nová Morphia (); morphia.mapPackage ("com.baeldung.morphia"); Datastore datastore = morphia.createDatastore (nový MongoClient (), "knižnica"); datastore.ensureIndexes ();

To je skoro všetko! Poďme to lepšie pochopiť. Aby naše mapovacie operácie fungovali, potrebujeme dve veci:

  1. Mapovač: Je zodpovedný za mapovanie našich Java POJO do zbierok MongoDB. V našom útržku kódu vyššie Morfia je za to zodpovedná trieda. Všimnite si, ako konfigurujeme balík tam, kde má hľadať naše POJO.
  2. Pripojenie: Toto je pripojenie k databáze MongoDB, na ktorom môže mapovač vykonávať rôzne operácie. Trieda Uloženie údajov berie ako parameter inštanciu MongoClient (z ovládača Java MongoDB) a názov databázy MongoDB, vráti aktívne pripojenie na spoluprácu.

Takže sme všetci pripravení toto používať Uloženie údajov a pracovať s našimi entitami.

5. Ako pracovať s entitami?

Skôr ako môžeme použiť naše čerstvo vyliate Uloženie údajov, musíme definovať niektoré entity domény, s ktorými budeme pracovať.

5.1. Jednoduchá entita

Začnime definíciou jednoduchého Kniha entita s niektorými atribútmi:

@Entity („Knihy“) verejná trieda Kniha {@Id private String isbn; súkromný názov reťazca; súkromný autor reťazcov; @ Vlastnosť („cena“) súkromné ​​dvojnásobné náklady; // konštruktory, getre, nastavovače a hashCode, equals, toString implementácie}

Tu je potrebné poznamenať niekoľko zaujímavých vecí:

  • Všimnite si anotáciu @Subjekt ktorý kvalifikuje tento POJO na mapovanie ODM od Morphia
  • Morphia predvolene mapuje entitu na kolekciu v MongoDB podľa názvu svojej triedy, ale môžeme ju explicitne prepísať (ako sme to urobili pre entitu) Kniha tu)
  • Morphia predvolene mapuje premenné v entite na kľúče v kolekcii MongoDB podľa názvu premennej, ale opäť ju môžeme prepísať (ako sme to urobili pre premennú) náklady tu)
  • Nakoniec musíme označte premennú v entite, ktorá má pôsobiť ako primárny kľúč, anotáciou @Id (ako keby sme tu pre našu knihu používali ISBN)

5.2. Subjekty so vzťahmi

V skutočnom svete však nie sú entity také jednoduché, ako vyzerajú, a majú medzi sebou zložité vzťahy. Napríklad naša jednoduchá entita Kniha môže mať a Vydavateľ a môže odkazovať na ďalšie sprievodné knihy. Ako ich vymodelujeme?

MongoDB ponúka dva mechanizmy na budovanie vzťahov - odkazovanie a vkladanie. Ako už názov napovedá, s referencovaním MongoDB ukladá súvisiace údaje ako samostatný dokument v rovnakej alebo inej kolekcii a odkazuje na ne iba pomocou svojho ID.

Naopak, pri vkladaní MongoDB ukladá alebo skôr vkladá vzťah do samotného nadradeného dokumentu.

Pozrime sa, ako ich môžeme využiť. Začnime vkladaním Vydavateľ v našom Kniha:

@Embedded private Publisher vydavateľ;

Dosť jednoduché. Teraz poďme a pridajme odkazy na ďalšie knihy:

@ Referenčné súkromné ​​zoznamové sprievodné knihy;

A je to - Morphia poskytuje pohodlné poznámky k modelovaniu vzťahov, ako ich podporuje MongoDB. Voľba odkazovanie vs vkladanie by však malo vychádzať zo zložitosti, redundancie a konzistencie dátového modelu okrem iného.

Cvičenie je podobné normalizácii v relačných databázach.

Teraz sme pripravení vykonať nejaké operácie Kniha použitím Uloženie údajov.

6. Niektoré základné operácie

Pozrime sa, ako pracovať s niektorými základnými operáciami pomocou Morphie.

6.1. Uložiť

Začnime s najjednoduchšou operáciou, vytvorením inštancie Kniha v našej databáze MongoDB knižnica:

Vydavateľ vydavateľ = nový vydavateľ (new ObjectId (), "Awsome Publisher"); Book book = new Book ("9781565927186", "Learning Java", "Tom Kirkman", 3.95, vydavateľ); Book companionBook = new Book ("9789332575103", "Java Performance Companion", "Tom Kirkman", 1,95, vydavateľ); book.addCompanionBooks (sprievodná kniha); datastore.save (sprievodná kniha); datastore.save (kniha);

To stačí na to, aby sme Morphii umožnili vytvoriť kolekciu v našej databáze MongoDB, ak neexistuje, a vykonať operáciu upsert.

6.2. Dopyt

Uvidíme, či dokážeme dopytovať knihu, ktorú sme práve vytvorili v MongoDB:

Zoznam kníh = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (1, books.size ()); assertEquals (kniha, books.get (0));

Dopytovanie dokumentu v Morphii začína vytvorením dotazu pomocou Uloženie údajov a potom deklaratívne pridanie filtrov na potešenie tých, ktorí majú radi funkčné programovanie!

Morphia podporuje oveľa zložitejšie vytváranie dotazov pomocou filtrov a operátorov. Morphia navyše umožňuje obmedziť, preskočiť a zoradiť výsledky v dotaze.

A čo viac, Morphia nám umožňuje používať nespracované dotazy napísané pomocou ovládača Java pre MongoDB pre väčšiu kontrolu, ak by to bolo potrebné.

6.3. Aktualizácia

Aj keď operácia uloženia dokáže spracovať aktualizácie, ak sa zhoduje primárny kľúč, Morphia ponúka spôsoby selektívnej aktualizácie dokumentov:

Dotaz na dotaz = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java"); UpdateOperations updates = datastore.createUpdateOperations (Book.class) .inc ("cena", 1); datastore.update (dopyt, aktualizácie); Zoznam kníh = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (4,95, books.get (0) .getCost ());

Tu budujeme dopyt a operáciu aktualizácie, aby sme o jednu cenu zvýšili cenu všetkých kníh vrátených dotazom.

6.4. Odstrániť

Nakoniec to, čo bolo vytvorené, musí byť odstránené! Opäť je to s Morphiou celkom intuitívne:

Dotaz na dotaz = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java"); datastore.delete (dopyt); Zoznam kníh = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (0, books.size ());

Dotaz vytvoríme celkom podobne ako predtým a spustíme operáciu mazania na Uloženie údajov.

7. Pokročilé použitie

MongoDB má niektoré pokročilé operácie ako agregácia, indexovanie a mnoho ďalších. Aj keď nie je možné všetko vykonať pomocou Morphie, určite je možné niečo z toho dosiahnuť. Pre ostatných, bohužiaľ, sa budeme musieť vrátiť k ovládaču Java pre MongoDB.

Zamerajme sa na niektoré z týchto pokročilých operácií, ktoré môžeme vykonávať prostredníctvom Morphie.

7.1. Agregácia

Agregácia v MongoDB nám umožňuje definovať séria operácií v potrubí, ktoré môžu pracovať so súborom dokumentov a produkovať agregovaný výstup.

Morphia má API na podporu takéhoto agregačného potrubia.

Predpokladajme, že chceme zhromaždiť údaje z našej knižnice takým spôsobom, aby sme všetky knihy zoskupili podľa ich autora:

Iterator iterator = datastore.createAggregation (Book.class) .group ("autor", zoskupenie ("knihy", push ("titul"))) .out (Author.class);

Ako to teda funguje? Začneme vytvorením agregačného potrubia pomocou rovnakého starého Uloženie údajov. Musíme poskytnúť subjekt, na ktorom chceme vykonávať agregačné operácie, napríklad Kniha tu.

Ďalej chceme zoskupiť dokumenty podľa „autora“ a zoskupiť ich „názov“ do kľúča s názvom „knihy“. Nakoniec tu pracujeme s ODM. Musíme teda definovať entitu, ktorá bude zhromažďovať naše agregované údaje - v našom prípade je to tak Autor.

Samozrejme musíme definovať entitu s názvom Autor s premennou zvanou knihy:

@Entity public class Autor {@Id private String name; súkromné ​​zoznamové knihy; // ďalší potrební getri a nastavovatelia}

To samozrejme iba poškriabe povrch veľmi výkonnej konštrukcie, ktorú poskytuje MongoDB, a možno ho ďalej preskúmať a získať ďalšie podrobnosti.

7.2. Projekcia

Projekcia v MongoDB nám to umožňuje v našich dotazoch vyberte iba polia, ktoré chceme načítať z dokumentov. V prípade, že je štruktúra dokumentu zložitá a ťažká, môže to byť skutočne užitočné, keď potrebujeme iba niekoľko polí.

Predpokladajme, že v našom dopyte stačí načítať knihy s ich názvom:

Zoznam kníh = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .project ("title", true) .find () .toList (); assertEquals ("Učenie jazyka Java", books.get (0) .getTitle ()); assertNull (books.get (0) .getAuthor ());

Tu, ako vidíme, dostaneme späť iba názov v našom výsledku a nie autora a ďalšie polia. Mali by sme však byť opatrní pri použití projektovaného výstupu pri ukladaní späť do MongoDB. Môže to mať za následok stratu údajov!

7.3. Indexovanie

Indexy hrajú veľmi dôležitú úlohu pri optimalizácii dotazov pomocou databáz - relačných aj mnohých nerelačných.

MongoDB definuje indexy na úrovni kolekcie s jedinečným indexom vytvoreným na primárnom kľúči v predvolenom nastavení. MongoDB navyše umožňuje vytváranie indexov v ľubovoľnom poli alebo podpolí v rámci dokumentu. Mali by sme sa rozhodnúť vytvoriť index na kľúči v závislosti od dotazu, ktorý chceme vytvoriť.

Napríklad v našom príklade môžeme vytvoriť index v poli „title“ z Kniha pretože sa ho často pýtame:

@Indexes ({@Index (fields = @Field ("title"), options = @IndexOptions (name = "book_title"))}) verejná trieda Book {// ... @Property private String title; // ...}

Samozrejme môžeme odovzdať ďalšie možnosti indexovania, aby sme prispôsobili nuansy vytvoreného indexu. Pole by malo byť označené anotáciou @Nehnuteľnosť ktoré sa majú použiť v indexe.

Okrem indexu na úrovni triedy má Morphia okrem toho anotáciu, ktorá definuje aj index na úrovni poľa.

7.4. Overenie schémy

Máme možnosť poskytnúť pravidlá overovania údajov pre kolekciu, ktorú môže MongoDB používať pri vykonávaní operácie aktualizácie alebo vloženia. Morphia to podporuje prostredníctvom svojich rozhraní API.

Povedzme, že nechceme vkladať knihu bez platnej ceny. Na dosiahnutie tohto cieľa môžeme využiť overenie schémy:

@Validation ("{cena: {$ gt: 0}}") verejná trieda Kniha {// ... @Property ("cena") súkromné ​​dvojnásobné náklady; // ...}

Tu je možné použiť bohatú sadu validácií poskytovaných serverom MongoDB.

8. Alternatívne ODM MongoDB

Morphia nie je jediný dostupný MongoDB ODM pre Java. Existuje niekoľko ďalších, ktoré môžeme zvážiť v našich aplikáciách. Diskusia o porovnaní s Morphiou tu nie je možná, ale vždy je užitočné poznať naše možnosti:

  • Jarné dáta: Poskytuje jarný programovací model pre prácu s MongoDB
  • MongoJack: Poskytuje priame mapovanie z JSON na objekty MongoDB

Toto nie je úplný zoznam MongoDB ODM pre Java, ale je k dispozícii niekoľko zaujímavých alternatív!

9. Záver

V tomto článku sme pochopili základné podrobnosti MongoDB a použitie ODM na pripojenie a fungovanie MongoDB z programovacieho jazyka ako Java. Ďalej sme preskúmali Morphiu ako MongoDB ODM pre Javu a rôzne možnosti, ktoré má.

Ako vždy, kód nájdete na GitHub.