Introduksjon til Morphia - Java ODM for MongoDB

1. Oversikt

I denne opplæringen vil vi forstå hvordan du bruker Morphia, en Object Document Mapper (ODM) for MongoDB i Java.

I prosessen vil vi også forstå hva som er en ODM og hvordan det letter arbeidet med MongoDB.

2. Hva er en ODM?

For de uinnvidde i dette området, MongoDB er en dokumentorientert database bygget for å distribueres av naturen. Dokumentorienterte databaser, i enkle termer, administrerer dokumenter, som ikke er annet enn en skjemafri måte å organisere semistrukturerte data på. De faller under en bredere og løst definert paraply av NoSQL-databaser, oppkalt etter deres tilsynelatende avgang fra den tradisjonelle organisasjonen av SQL-databaser.

MongoDB gir drivere for nesten alle populære programmeringsspråk som Java. Disse driverne tilbyr et lag med abstraksjon for å jobbe med MongoDB slik at vi ikke jobber med Wire Protocol direkte. Tenk på dette som Oracle som gir en implementering av JDBC-driveren for deres relasjonsdatabase.

Imidlertid, hvis vi husker våre dager med å jobbe med JDBC direkte, kan vi sette pris på hvor rotete det kan bli - spesielt i et objektorientert paradigme. Heldigvis har vi ORM-rammer (Object Relational Mapping) som Hibernate til vår redning. Det er ikke veldig annerledes for MongoDB.

Selv om vi absolutt kan jobbe med driveren på lavt nivå, krever det mye mer kjele for å utføre oppgaven. Her har vi det et lignende konsept som ORM kalt Object Document Mapper (ODM). Morphia fyller nøyaktig den plassen for Java-programmeringsspråket og fungerer på toppen av Java-driveren for MongoDB.

3. Sette opp avhengigheter

Vi har sett nok teori til å få oss inn i noen kode. For eksemplene våre skal vi modellere et bibliotek med bøker og se hvordan vi kan administrere det i MongoDB ved hjelp av Morphia.

Men før vi begynner, må vi sette opp noen avhengigheter.

3.1. MongoDB

Vi må ha en løpende forekomst av MongoDB å jobbe med. Det er flere måter å få dette på, og det enkleste er å laste ned og installere community-utgaven på vår lokale maskin.

Vi bør la alle standardkonfigurasjoner være som de er, inkludert porten som MongoDB kjører på.

3.2. Morphia

Vi kan laste ned de forhåndsbygde JAR-ene til Morphia fra Maven Central og bruke dem i vårt Java-prosjekt.

Den enkleste måten er imidlertid å bruke et avhengighetsstyringsverktøy som Maven:

 dev.morphia.morphia core 1.5.3 

4. Hvordan koble til ved hjelp av Morphia?

Nå som vi har MongoDB installert og kjører og har satt opp Morphia i Java-prosjektet vårt, er vi klare til å koble til MongoDB ved hjelp av Morphia.

La oss se hvordan vi kan oppnå det:

Morphia morphia = nye Morphia (); morphia.mapPackage ("com.baeldung.morphia"); Datastore datastore = morphia.createDatastore (ny MongoClient (), "bibliotek"); datastore.ensureIndexes ();

Det er ganske mye det! La oss forstå dette bedre. Vi trenger to ting for at kartleggingsoperasjonene skal fungere:

  1. En kartlegger: Dette er ansvarlig for kartlegge våre Java POJOer til MongoDB Collections. I kodebiten vår ovenfor, Morphia er klassen som er ansvarlig for det. Legg merke til hvordan vi konfigurerer pakken der den skal se etter POJO-ene våre.
  2. En tilkobling: Dette er forbindelsen til en MongoDB-database som kartleggeren kan utføre forskjellige operasjoner på. Klassen Datastore tar som parameter en forekomst av MongoClient (fra Java MongoDB-driveren) og navnet på MongoDB-databasen, returnere en aktiv forbindelse til å jobbe med.

Så vi er klare til å bruke dette Datastore og samarbeide med enhetene våre.

5. Hvordan jobbe med enheter?

Før vi kan bruke vår nymalte Datalager, må vi definere noen domenenheter å jobbe med.

5.1. Enkel enhet

La oss begynne med å definere en enkel Bok enhet med noen attributter:

@Entity ("Books") public class Book {@Id private String isbn; privat strengetittel; privat strengforfatter; @Property ("pris") privat dobbel kostnad; // constructors, getters, setters and hashCode, equals, toString implementations}

Det er et par interessante ting å merke seg her:

  • Legg merke til kommentaren @Enhet som kvalifiserer denne POJO for ODM-kartlegging av Morphia
  • Morphia tilordner som standard en enhet til en samling i MongoDB med navnet på klassen, men vi kan eksplisitt overstyre dette (som vi har gjort for enheten Bok her)
  • Morphia tilordner som standard variablene i en enhet til nøklene i en MongoDB-samling med navnet på variabelen, men igjen kan vi overstyre dette (som vi har gjort for variabelen koste her)
  • Til slutt må vi merke en variabel i enheten for å fungere som primærnøkkel ved merknaden @Id (som om vi bruker ISBN for boken vår her)

5.2. Enheter med forhold

I den virkelige verden er imidlertid enheter nesten ikke så enkle som de ser ut og har komplekse forhold til hverandre. For eksempel vår enkle enhet Bok kan ha en Forlegger og kan referere til andre følgebøker. Hvordan modellerer vi dem?

MongoDB tilbyr to mekanismer for å bygge relasjoner - Henvisning og innebygging. Som navnet antyder, med henvisning lagrer MongoDB relaterte data som et eget dokument i den samme eller en annen samling, og refererer bare til dem ved hjelp av ID-en.

Tvert imot, med innebygging lagrer eller rettere MongoDB relasjonen i selve foreldredokumentet.

La oss se hvordan vi kan bruke dem. La oss begynne med å legge inn Forlegger i vår Bok:

@Embedded private Publisher-utgivere;

Enkelt nok. La oss nå fortsette og legge til referanser til andre bøker:

@Reference private List companionBooks;

Det er det - Morphia gir praktiske kommentarer til modellforhold som støttes av MongoDB. Valget av referanse mot innebygging bør imidlertid trekke fra datamodellens kompleksitet, redundans og konsistens blant andre hensyn.

Øvelsen ligner på normalisering i relasjonsdatabaser.

Nå er vi klare til å utføre noen operasjoner på Bok ved hjelp av Datastore.

6. Noen grunnleggende operasjoner

La oss se hvordan vi kan jobbe med noen av de grunnleggende operasjonene ved hjelp av Morphia.

6.1. Lagre

La oss begynne med den enkleste operasjonen, og lage en forekomst av Bok i MongoDB-databasen vår bibliotek:

Publisher publisher = new Publisher (new ObjectId (), "Awsome Publisher"); Bokbok = ny bok ("9781565927186", "Learning Java", "Tom Kirkman", 3,95, forlegger); Book companionBook = new Book ("9789332575103", "Java Performance Companion", "Tom Kirkman", 1.95, forlegger); book.addCompanionBooks (companionBook); datastore.save (følgebok); datastore.save (bok);

Dette er nok til å la Morphia opprette en samling i MongoDB-databasen vår, hvis den ikke eksisterer, og utføre en oppoveroperasjon.

6.2. Spørsmål

La oss se om vi kan spørre boken vi nettopp opprettet i MongoDB:

Listebøker = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (1, books.size ()); assertEquals (bok, books.get (0));

Spørring av et dokument i Morphia begynner med å opprette et spørsmål ved hjelp av Datastore og deretter legge til filtre til glede for de som er forelsket i funksjonell programmering!

Morphia støtter mye mer kompleks spørrekonstruksjon med filtre og operatører. Videre tillater Morphia å begrense, hoppe over og ordne resultater i spørringen.

I tillegg tillater Morphia oss å bruke rå spørsmål skrevet med Java-driveren for MongoDB for mer kontroll, hvis det er nødvendig.

6.3. Oppdater

Selv om en lagringsoperasjon kan håndtere oppdateringer hvis primærnøkkelen stemmer overens, gir Morphia måter å selektivt oppdatere dokumenter:

Query query = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java"); UpdateOperations updates = datastore.createUpdateOperations (Book.class) .inc ("pris", 1); datastore.update (spørring, oppdateringer); Listebøker = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (4,95, books.get (0) .getCost ());

Her bygger vi et spørsmål og en oppdateringsoperasjon for å øke prisen på alle bøker som returneres av spørringen med en.

6.4. Slett

Til slutt, det som er opprettet må slettes! Igjen, med Morphia, er det ganske intuitivt:

Query query = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java"); datastore.delete (spørring); Listebøker = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .find () .toList (); assertEquals (0, books.size ());

Vi oppretter spørringen ganske likt som før og kjører sletteoperasjonen på Datastore.

7. Avansert bruk

MongoDB har noen avanserte operasjoner som Aggregering, Indeksering og mange andre. Selv om det ikke er mulig å utføre alt dette ved hjelp av Morphia, er det absolutt mulig å oppnå noe av det. For andre må vi dessverre falle tilbake til Java-driveren for MongoDB.

La oss fokusere på noen av disse avanserte operasjonene som vi kan utføre gjennom Morphia.

7.1. Aggregering

Aggregering i MongoDB lar oss definere en rekke operasjoner i en rørledning som kan operere på et sett med dokumenter og produsere samlet utdata.

Morphia har en API for å støtte en slik aggregeringsrørledning.

La oss anta at vi ønsker å samle biblioteksdataene våre på en slik måte at vi har alle bøkene gruppert av forfatteren:

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

Så hvordan fungerer dette? Vi begynner med å lage en aggregeringsrørledning med den samme gamle Datastore. Vi må gi enheten vi ønsker å utføre aggregeringsoperasjoner på, for eksempel Bok her.

Deretter ønsker vi å gruppere dokumenter etter “forfatter” og samle deres “tittel” under en nøkkel kalt “bøker”. Til slutt jobber vi med en ODM her. Så vi må definere en enhet for å samle inn våre samlede data - i vårt tilfelle er det Forfatter.

Selvfølgelig må vi definere en enhet som heter Forfatter med en variabel som heter bøker:

@Entity public class Forfatter {@Id privat strengnavn; private liste bøker; // andre nødvendige getters og setters}

Dette skraper selvfølgelig bare overflaten til en veldig kraftig konstruksjon levert av MongoDB og kan utforskes nærmere for detaljer.

7.2. Projeksjon

Projeksjon i MongoDB lar oss velg bare feltene vi vil hente fra dokumenter i spørsmålene våre. I tilfelle dokumentstrukturen er kompleks og tung, kan dette være veldig nyttig når vi bare trenger noen få felt.

La oss anta at vi bare trenger å hente bøker med tittelen i spørringen:

Listebøker = datastore.createQuery (Book.class) .field ("title") .contains ("Learning Java") .project ("title", true) .find () .toList (); assertEquals ("Learning Java", books.get (0) .getTitle ()); assertNull (books.get (0) .getAuthor ());

Her, som vi kan se, får vi bare tilbake tittelen i resultatet vårt, og ikke forfatteren og andre felt. Vi bør imidlertid være forsiktige med å bruke den projiserte produksjonen til å spare tilbake til MongoDB. Dette kan føre til tap av data!

7.3. Indeksering

Indekser spiller en veldig viktig rolle i spørreoptimalisering med databaser - relasjonelle så vel som mange ikke-relasjonelle.

MongoDB definerer indekser på nivået av samlingen med en unik indeks opprettet på primærnøkkelen som standard. Videre tillater MongoDB at indekser opprettes på hvilket som helst felt eller underfelt i et dokument. Vi bør velge å lage en indeks på en nøkkel, avhengig av spørringen vi ønsker å lage.

For eksempel, i vårt eksempel, kan det være lurt å lage en indeks på feltet "tittel" på Bok som vi ofte ender med å spørre om det:

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

Selvfølgelig kan vi passere flere indekseringsalternativer for å skreddersy nyansene til indeksen som blir opprettet. Merk at feltet skal merkes av @Eiendom skal brukes i en indeks.

Videre, bortsett fra klassenivåindeksen, har Morphia en kommentar for å definere en feltnivåindeks også.

7.4. Validering av skjema

Vi har et alternativ å tilby datavalideringsregler for en samling som MongoDB kan bruke mens du utfører en oppdatering eller innsettingsoperasjon. Morphia støtter dette gjennom sine APIer.

La oss si at vi ikke vil sette inn en bok uten gyldig pris. Vi kan utnytte skjemavalidering for å oppnå dette:

@Validation ("{price: {$ gt: 0}}") public class Book {// ... @Property ("price") privat dobbel pris; // ...}

Det er et rikt sett med valideringer levert av MongoDB som kan brukes her.

8. Alternative MongoDB ODMer

Morphia er ikke den eneste tilgjengelige MongoDB ODM for Java. Det er flere andre som vi kan vurdere å bruke i applikasjonene våre. En diskusjon om sammenligning med Morphia er ikke mulig her, men det er alltid nyttig å vite hvilke alternativer vi har:

  • Spring Data: Tilbyr en vårbasert programmeringsmodell for arbeid med MongoDB
  • MongoJack: Gir direkte kartlegging fra JSON til MongoDB-objekter

Dette er ikke en komplett liste over MongoDB ODMer for Java, men det er noen interessante alternativer tilgjengelig!

9. Konklusjon

I denne artikkelen forsto vi de grunnleggende detaljene i MongoDB og bruken av en ODM for å koble til og operere på MongoDB fra et programmeringsspråk som Java. Vi utforsket videre Morphia som en MongoDB ODM for Java og de forskjellige funksjonene den har.

Som alltid kan koden bli funnet på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found