Spring Data MongoDB - Indekser, kommentarer og konvertere

1. Oversigt

Denne vejledning udforsker nogle af kerneegenskaberne i Spring Data MongoDB - indeksering, almindelige annoteringer og konvertere.

2. Indekser

2.1. @Indekseret

Denne kommentar markerer feltet som indekseret i MongoDB:

@QueryEntity @Document offentlig klasse bruger {@Indexed privat strengnavn; ...}

Nu hvor navn felt er indekseret - lad os se på indekserne i MongoDB:

db.user.getIndexes ();

Her er hvad vi har på databaseniveau:

[{"v": 1, "key": {"_id": 1}, "name": "_id_", "ns": "test.user"}, {"v": 1, "key": {"name": 1}, "name": "name", "ns": "test.user"}]

Som du kan se, har vi to indekser - en af ​​dem er _id - som blev oprettet som standard på grund af @Id kommentar og den anden er vores navn Mark.

2.2. Opret et indeks programmatisk

Vi kan også oprette et indeks programmatisk:

mongoOps.indexOps (User.class). sikreIndex (nyt indeks (). on ("navn", Direction.ASC)); 

Vi har nu oprettet et indeks til feltet navn og resultatet bliver det samme som i det foregående afsnit.

2.3. Sammensatte indekser

MongoDB understøtter sammensatte indekser, hvor en enkelt indeksstruktur indeholder referencer til flere felter.

Lad os se et hurtigt eksempel ved hjælp af sammensatte indekser:

@QueryEntity @Document @CompoundIndexes ({@CompoundIndex (name = "email_age", def = "{'email.id': 1, 'age': 1}")}) offentlig klasse bruger {//}

Vi oprettede et sammensat indeks med e-mail og alder felter. Lad os nu tjekke de faktiske indekser:

{"v": 1, "key": {"email.id": 1, "age": 1}, "name": "email_age", "ns": "test.user"} 

Bemærk, at en DBRef felt kan ikke markeres med @Indeks - dette felt kan kun være en del af et sammensat indeks.

3. Almindelige kommentarer

3.1 @Transient

Som du kunne forvente, udelukker denne enkle kommentar feltet fra at blive vedvarende i databasen:

offentlig klasse bruger {@Transient private Integer yearOfBirth;
 // standard getter og setter}

Lad os indsætte bruger med indstillingsfeltet fødsels år:

Brugerbruger = ny bruger (); user.setName ("Alex"); user.setYearOfBirth (1985); mongoTemplate.insert (bruger); 

Hvis vi nu ser status for databasen, ser vi, at den arkiverede fødsels år blev ikke gemt:

{"_id": ObjectId ("55d8b30f758fd3c9f374499b"), "name": "Alex", "age": null}

Så hvis vi spørger og tjekker:

mongoTemplate.findOne (Query.query (Criteria.where ("name"). is ("Alex")), User.class) .getYearOfBirth ()

Resultatet bliver nul.

3.2. @Mark

@Mark angiver nøglen, der skal bruges til feltet i JSON-dokumentet:

@Field ("email") privat EmailAddress emailAddress; 

Nu email adresse gemmes i databasen ved hjælp af nøglen e-mail:

Brugerbruger = ny bruger (); user.setName ("Brendan"); EmailAddress emailAddress = ny EmailAddress (); emailAddress.setValue ("[email protected]"); user.setEmailAddress (emailAddress); mongoTemplate.insert (bruger); 

Og databasens tilstand:

{"_id": ObjectId ("55d076d80bad441ed114419d"), "name": "Brendan", "age": null, "email": {"value": "[email protected]"}}

3.3. @PersistenceConstructor og @Værdi

@PersistenceConstructor markerer en konstruktør, selv en, der er pakkebeskyttet, som den primære konstruktør, der bruges af persistenslogikken. Konstruktørargumenterne kortlægges ved navn til nøgleværdierne i den hentede DBObject.

Lad os se på denne konstruktør for vores Bruger klasse:

@PersistenceConstructor offentlig bruger (String name, @Value ("# root.age?: 0") Integer age, EmailAddress emailAddress) {this.name = name; this.age = alder; this.emailAddress = emailAddress; } 

Bemærk brugen af ​​standardfjederen @Værdi kommentar her. Det er ved hjælp af denne kommentar, at vi kan bruge Spring Expressions til at omdanne en nøgles værdi hentet fra databasen, før den bruges til at konstruere et domæneobjekt. Det er en meget kraftig og meget nyttig funktion her.

I vores eksempel hvis alder er ikke indstillet til, at den vil blive indstillet til 0 som standard.

Lad os nu se, hvordan det fungerer:

Brugerbruger = ny bruger (); user.setName ("Alex"); mongoTemplate.insert (bruger);

Vores database vil se ud:

{"_id": ObjectId ("55d074ca0bad45f744a71318"), "name": "Alex", "age": null}

alder felt er nul, men når vi spørger dokumentet og henter det alder:

mongoTemplate.findOne (Query.query (Criteria.where ("name"). er ("Alex")), User.class) .getAge ();

Resultatet bliver 0.

4. Konvertere

Lad os nu se på en anden meget nyttig funktion i Spring Data MongoDB - konvertere og specifikt på MongoConverter.

Dette bruges til at håndtere kortlægningen af ​​alle Java-typer til DBO-objekter ved opbevaring og forespørgsel på disse objekter.

Vi har to muligheder - vi kan enten arbejde med MappingMongoConverter - eller SimpleMongoConverter i tidligere versioner (dette blev udfaset i Spring Data MongoDB M3, og dets funktionalitet er flyttet ind MappingMongoConverter).

Eller vi kan skrive vores egen tilpassede konverter. For at gøre det skal vi implementere Konverter interface og registrere implementeringen i MongoConfig.

Lad os se på et hurtigt eksempel. Som du har set i nogle af JSON-output her, har alle objekter, der er gemt i en database, feltet _klasse som gemmes automatisk. Hvis vi dog gerne vil springe det pågældende felt over under vedholdenhed, kan vi gøre det ved hjælp af en MappingMongoConverter.

Først - her er den tilpassede konverteringsimplementering:

@Komponent offentlig klasse UserWriterConverter implementerer Converter {@Override public DBObject convert (User user) {DBObject dbObject = new BasicDBObject (); dbObject.put ("navn", user.getName ()); dbObject.put ("alder", user.getAge ()); hvis (user.getEmailAddress ()! = null) {DBObject emailDbObject = ny BasicDBObject (); emailDbObject.put ("værdi", user.getEmailAddress (). getValue ()); dbObject.put ("e-mail", emailDbObject); } dbObject.removeField ("_ klasse"); returnere dbObject; }}

Læg mærke til, hvordan vi let kan nå målet om ikke at vedvare _klasse ved specifikt at fjerne feltet direkte her.

Nu skal vi registrere den tilpassede konverter:

privat liste konvertere = ny ArrayList(); @ Override offentlige MongoCustomConversions customConversions () {converters.add (ny UserWriterConverter ()); returner nye MongoCustomConversions (konvertere); }

Vi kan selvfølgelig også opnå det samme resultat med XML-konfiguration, hvis vi har brug for:

Når vi nu gemmer en ny bruger:

Brugerbruger = ny bruger (); user.setName ("Chris"); mongoOps.insert (bruger); 

Det resulterende dokument i databasen indeholder ikke længere klasseoplysningerne:

{"_id": ObjectId ("55cf09790bad4394db84b853"), "name": "Chris", "age": null}

5. Konklusion

I denne vejledning har vi dækket nogle kernekoncepter for at arbejde med Spring Data MongoDB - indeksering, almindelige annoteringer og konvertere.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit github-projekt.


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