Uvod u Morphia - Java ODM za MongoDB

1. Pregled

U ovom ćemo uputstvu razumjeti kako se koristi Morphia, mapa objektnih dokumenata (ODM) za MongoDB u Javi.

U tom ćemo procesu razumjeti i što je ODM i kako olakšava rad s MongoDB-om.

2. Što je ODM?

Za one koji nisu upućeni u ovo područje, MongoDB je baza podataka orijentirana na dokumente izgrađena da bi je distribuirala priroda. Baze podataka orijentirane na dokumente, jednostavnim riječima, upravljaju dokumentima koji nisu ništa drugo nego bez sheme način organiziranja polustrukturiranih podataka. Oni potpadaju pod širi i slabo definiran kišobran NoSQL baza podataka, nazvan nakon njihovog očitog odstupanja od tradicionalne organizacije SQL baza podataka.

MongoDB pruža upravljački programi za gotovo sve popularne programske jezike poput Jave. Ovi upravljački programi nude sloj apstrakcije za rad s MongoDB-om tako da ne radimo izravno s Wire Protocolom. Shvatite to kao Oracle koji pruža implementaciju JDBC pokretačkog programa za njihovu relacijsku bazu podataka.

Međutim, ako se prisjetimo svojih dana izravne suradnje s JDBC-om, možemo shvatiti koliko neuredan može postati - posebno u objektno orijentiranoj paradigmi. Srećom, za spašavanje imamo okvire objektnog relacijskog mapiranja (ORM) poput Hibernate. Za MongoDB nije puno drugačije.

Iako zasigurno možemo surađivati ​​s upravljačkim programom niske razine, za postizanje zadatka potrebno je puno više uzorka. Evo, imamo sličan koncept ORM-u pod nazivom Object Document Mapper (ODM). Morphia točno ispunjava taj prostor za programski jezik Java i radi povrh Java pokretačkog programa za MongoDB.

3. Postavljanje ovisnosti

Vidjeli smo dovoljno teorije da nas uvuče u neki kod. Za naše ćemo primjere modelirati biblioteku knjiga i vidjeti kako možemo njome upravljati u MongoDB-u pomoću Morphije.

Ali prije nego što započnemo, morat ćemo postaviti neke ovisnosti.

3.1. MongoDB

Moramo imati pokrenutu instancu MongoDB-a za rad. Postoji nekoliko načina da se to dobije, a najjednostavniji je preuzeti i instalirati izdanje zajednice na naš lokalni stroj.

Trebali bismo ostaviti sve zadane konfiguracije kakve jesu, uključujući port na kojem radi MongoDB.

3.2. Morfijum

Unaprijed izrađene JAR-ove za Morphia možemo preuzeti s Maven Central-a i koristiti ih u našem Java projektu.

Međutim, najjednostavniji je način koristiti alat za upravljanje ovisnostima poput Mavena:

 dev.morphia.morphia core 1.5.3 

4. Kako se povezati pomoću Morphije?

Sad kad smo instalirali i pokrenuli MongoDB i postavili Morphia u našem Java projektu, spremni smo za povezivanje s MongoDB pomoću Morphia.

Pogledajmo kako to možemo postići:

Morphia morphia = nova Morphia (); morphia.mapPackage ("com.baeldung.morphia"); Trgovina podataka datastore = morphia.createDatastore (novi MongoClient (), "knjižnica"); datastore.ensureIndexes ();

To je poprilično to! Shvatimo to bolje. Za rad operacija mapiranja potrebne su nam dvije stvari:

  1. Maper: Ovo je odgovorno za mapiranje naših Java POJO-ova u MongoDB kolekcije. U našem isječku koda gore, Morfijum je li klasa odgovorna za to. Imajte na umu kako konfiguriramo paket tamo gdje treba tražiti naše POJO-ove.
  2. Veza: Ovo je veza s MongoDB bazom podataka na kojoj mapper može izvršavati različite operacije. Razred Skladište podataka uzima kao parametar primjerak MongoClient (iz upravljačkog programa Java MongoDB) i naziv baze podataka MongoDB, vraćanje aktivne veze za rad s.

Dakle, svi smo spremni koristiti ovo Skladište podataka i rad s našim entitetima.

5. Kako raditi s entitetima?

Prije nego što upotrijebimo svoj svježe kovani Skladište podataka, moramo definirati neke entitete domene za rad.

5.1. Jednostavna cjelina

Počnimo s definiranjem jednostavnog Knjiga entitet s nekim atributima:

@Entity ("Books") knjiga javne klase {@Id private String isbn; privatni naslov niza; privatni autor niza; @Property ("price") privatni dvostruki trošak; // konstruktori, getteri, postavljači i hashCode, jednako, implementacije toString}

Ovdje treba primijetiti nekoliko zanimljivih stvari:

  • Primijetite napomenu @Entitet koji kvalificira ovaj POJO za ODM mapiranje od Morphije
  • Morphia, prema zadanim postavkama, entitet preslikava na zbirku u MongoDB-u imenom svoje klase, ali to možemo izričito poništiti (kao što smo učinili za entitet Knjiga ovdje)
  • Morphia, prema zadanim postavkama, varijable u entitetu preslikava na ključeve u zbirci MongoDB imenom varijable, ali opet to možemo poništiti (kao što smo učinili za varijablu trošak ovdje)
  • Napokon, moramo označi varijablu u entitetu koja će djelovati kao primarni ključ oznakom @Iskaznica (kao da ovdje koristimo ISBN za našu knjigu)

5.2. Entiteti s vezama

Međutim, u stvarnom svijetu entiteti nisu toliko jednostavni kako izgledaju i imaju složene međusobne odnose. Na primjer, naš jednostavan entitet Knjiga može imati a Izdavač i može se pozvati na druge popratne knjige. Kako ih modeliramo?

MongoDB nudi dva mehanizma za izgradnju odnosa - referenciranje i ugrađivanje. Kao što i samo ime govori, s referenciranjem MongoDB srodne podatke pohranjuje kao zaseban dokument u istoj ili drugoj zbirci i samo ih referencira koristeći svoj id.

Naprotiv, s ugrađivanjem, MongoDB pohranjuje ili bolje rečeno ugrađuje odnos u sam nadređeni dokument.

Pogledajmo kako ih možemo koristiti. Počnimo s ugrađivanjem Izdavač u našem Knjiga:

@Embedded private Publisher izdavač;

Dovoljno jednostavno. Ajmo sada i dodajte reference na druge knjige:

@Reference privatni popis companionBooks;

To je to - Morphia pruža prikladne bilješke za modeliranje odnosa kao što to podržava MongoDB. Izbor referenciranje i ugrađivanje, međutim, treba crpiti iz složenosti modela podataka, suvišnosti i dosljednosti pored ostalih razmatranja.

Vježba je slična normalizaciji u relacijskim bazama podataka.

Sada smo spremni izvršiti neke operacije Knjiga koristeći Skladište podataka.

6. Neke osnovne operacije

Pogledajmo kako raditi s nekim od osnovnih operacija pomoću Morphije.

6.1. Uštedjeti

Počnimo s najjednostavnijim operacijama, stvaranjem instance Knjiga u našoj bazi podataka MongoDB knjižnica:

Izdavač izdavač = novi izdavač (novi ObjectId (), "Awsome Publisher"); Knjiga knjiga = nova knjiga ("9781565927186", "Učenje Java", "Tom Kirkman", 3,95, izdavač); Book companionBook = nova knjiga ("9789332575103", "Java Performance Companion", "Tom Kirkman", 1,95, izdavač); book.addCompanionBooks (companionBook); datastore.save (companionBook); datastore.save (knjiga);

To je dovoljno da Morphia stvori kolekciju u našoj bazi podataka MongoDB, ako ona ne postoji, i izvrši operaciju nadogradnje.

6.2. Upit

Pogledajmo možemo li postaviti upit za knjigu koju smo upravo stvorili u MongoDB:

Navesti knjige = datastore.createQuery (Book.class) .field ("title") .contens ("Java Learning") .find () .toList (); assertEquals (1, books.size ()); assertEquals (knjiga, books.get (0));

Upit za dokument u programu Morphia započinje stvaranjem upita pomoću Skladište podataka a zatim deklarativno dodavanjem filtara, na radost zaljubljenika u funkcionalno programiranje!

Morphia podržava mnogo složeniju konstrukciju upita s filtrima i operatorima. Štoviše, Morphia omogućuje ograničavanje, preskakanje i uređivanje rezultata u upitu.

Štoviše, Morphia nam omogućuje upotrebu sirovih upita napisanih s Java upravljačkim programom za MongoDB za veću kontrolu, ako to bude potrebno.

6.3. ažuriranje

Iako operacija spremanja može obraditi ažuriranja ako se primarni ključ podudara, Morphia nudi načine za selektivno ažuriranje dokumenata:

Upit upita = datastore.createQuery (Book.class) .field ("title") .contains ("Java učenje"); UpdateOperations updates = datastore.createUpdateOperations (Book.class) .inc ("cijena", 1); datastore.update (upit, ažuriranja); Popis knjiga = datastore.createQuery (Book.class) .field ("title") .contains ("Java Learning") .find () .toList (); assertEquals (4.95, books.get (0) .getCost ());

Ovdje gradimo upit i operaciju ažuriranja kako bismo za jedan povećali cijenu svih knjiga koje se vraćaju upitom.

6.4. Izbrisati

Konačno, ono što je stvoreno mora se izbrisati! Opet, kod Morphije je prilično intuitivno:

Upit upita = datastore.createQuery (Book.class) .field ("title") .contains ("Java učenje"); datastore.delete (upit); Navesti knjige = datastore.createQuery (Book.class) .field ("title") .contens ("Java Learning") .find () .toList (); assertEquals (0, books.size ());

Stvaramo upit na sličan način kao i prije i pokrećemo operaciju brisanja na Skladište podataka.

7. Napredna upotreba

MongoDB ima neke napredne operacije poput agregiranja, indeksiranja i mnogih drugih. Iako sve to nije moguće izvesti pomoću Morphije, sigurno je moguće postići nešto od toga. Za druge, nažalost, morat ćemo se vratiti Java upravljačkom programu za MongoDB.

Usredotočimo se na neke od ovih naprednih operacija koje možemo izvesti putem Morphije.

7.1. Zbrajanje

Agregacija u MongoDB-u omogućuje nam definiranje niz operacija u cjevovodu koji mogu operirati na skupu dokumenata i proizvesti zbirni izlaz.

Morphia ima API za podršku takvom agregacijskom cjevovodu.

Pretpostavimo da podatke iz naše knjižnice želimo objediniti na takav način da imamo sve knjige grupirane prema njihovom autoru:

Iterator iterator = datastore.createAggregation (Book.class) .group ("autor", grupiranje ("books", push ("title"))) .out (Author.class);

Pa, kako to funkcionira? Započinjemo stvaranjem cjevovoda za agregaciju koristeći isti stari Skladište podataka. Moramo osigurati entitet na kojem želimo izvoditi operacije agregiranja, na primjer, Knjiga ovdje.

Dalje, želimo grupirati dokumente prema "autoru" i agregirati njihov "naslov" pod ključem nazvanim "knjige". Napokon, ovdje radimo s ODM-om. Dakle, moramo definirati entitet koji će prikupljati naše agregirane podatke - u našem slučaju to jest Autor.

Naravno, moramo definirati entitet koji se zove Autor s varijablom koja se naziva knjige:

@ Entitet javne klase Autor {@Id privatni naziv niza; privatne knjige s popisa; // ostali potrebni geteri i postavljači}

To, naravno, samo ogrebe površinu vrlo moćne konstrukcije koju pruža MongoDB i može se dodatno istražiti za detalje.

7.2. Projekcija

Projekcija u MongoDB-u nam omogućuje odaberite samo polja koja želimo dohvatiti iz dokumenata u našim upitima. U slučaju da je struktura dokumenta složena i teška, to može biti jako korisno kada nam treba samo nekoliko polja.

Pretpostavimo da u našem upitu trebamo dohvatiti samo knjige s njihovim naslovom:

Navesti knjige = datastore.createQuery (Book.class) .field ("title") .contens ("Learning Java") .project ("title", true) .find () .toList (); assertEquals ("Učenje Jave", books.get (0) .getTitle ()); assertNull (books.get (0) .getAuthor ());

Ovdje, kao što vidimo, u našem rezultatu vraćamo samo naslov, a ne autora i druga polja. Međutim, trebali bismo biti oprezni pri korištenju projiciranog izlaza za vraćanje na MongoDB. To može rezultirati gubitkom podataka!

7.3. Indeksiranje

Indeksi igraju vrlo važnu ulogu u optimizaciji upita s bazama podataka - kako relacijske, tako i mnoge nerelacijske.

MongoDB definira indekse na razini zbirke s jedinstvenim indeksom stvorenim na primarnom ključu prema zadanim postavkama. Štoviše, MongoDB omogućuje stvaranje indeksa na bilo kojem polju ili potpolju unutar dokumenta. Trebali bismo stvoriti indeks na ključu ovisno o upitu koji želimo stvoriti.

Na primjer, u našem primjeru možda ćemo htjeti stvoriti indeks na polju "naslov" od Knjiga jer često na kraju postavljamo upite o tome:

@Indexes ({@Index (polja = @Field ("title"), options = @IndexOptions (name = "book_title"))}) javna klasa Book {// ... @Property private String title; // ...}

Naravno, možemo proslijediti dodatne mogućnosti indeksiranja kako bismo prilagodili nijanse indeksa koji se stvara. Imajte na umu da bi polje trebalo označiti sa @Vlasništvo da se koristi u indeksu.

Štoviše, osim indeksa na razini klase, Morphia ima napomenu da definira i indeks na razini polja.

7.4. Provjera sheme

Imamo mogućnost pružanja pravila provjere valjanosti podataka za zbirku koju MongoDB može koristiti tijekom izvođenja operacija ažuriranja ili umetanja. Morphia to podržava putem svojih API-ja.

Recimo da ne želimo umetnuti knjigu bez važeće cijene. Da bismo postigli ovo, možemo iskoristiti provjeru valjanosti sheme:

@Validation ("{price: {$ gt: 0}}") knjiga javne klase {// ... @Property ("price") privatni dvostruki trošak; // ...}

MongoDB nudi bogat set provjera valjanosti koji se ovdje mogu upotrijebiti.

8. Alternativni MongoDB ODM-ovi

Morphia nije jedini dostupni MongoDB ODM za Javu. Postoji nekoliko drugih koje bismo mogli razmotriti u svojim aplikacijama. Rasprava o usporedbi s Morphiom ovdje nije moguća, ali uvijek je korisno znati naše mogućnosti:

  • Spring Podaci: Pruža proljetni model programiranja za rad s MongoDB-om
  • MongoJack: pruža izravno mapiranje iz JSON-a u MongoDB objekte

Ovo nije cjelovit popis MongoDB ODM-ova za Javu, ali dostupno je nekoliko zanimljivih alternativa!

9. Zaključak

U ovom smo članku razumjeli osnovne detalje MongoDB-a i upotrebu ODM-a za povezivanje i rad na MongoDB-u iz programskog jezika poput Jave. Dalje smo istraživali Morphiju kao MongoDB ODM za Javu i razne mogućnosti koje ima.

Kao i uvijek, kod se može pronaći na GitHub-u.