Jeżeli od jakiegoś czasu zajmujesz się jakąkolwiek formą systemu zarządzania relacyjnymi bazami danych, prawdopodobnie spotkałeś się z nazwą MongoDB. Wprowadzony po raz pierwszy w 2009 roku, dziś mongoDb jest jednym z najpopularniejszych systemów zarządzania relacyjnymi bazami danych w branży. Głównym powodem jego szalonej popularności pomimo obecności na rynku starszych menedżerów oprogramowania relacyjnych baz danych, takich jak MySql, jest duża liczba i duża wszechstronność, jaką wnosi do tabeli. Wykorzystanie MongoDB eliminuje wiele potrzeb, jedną z nich jest konieczność tworzenia bazy danych i definiowania typu danych przy każdym uruchomieniu nowego projektu. Agenda artykułu klienta MongoDB:
- Wymagania wstępne dla klienta MongoDB
- Tworzenie projektu na Maven
- Dodanie swojej pierwszej usługi spoczynkowej JSON
- Konfigurowanie bazy danych MongoDB
- Uruchamianie skonfigurowanej bazy danych MongoDB
- Tworzenie frontonu
- Uproszczenie klienta MongoDB przy użyciu kodeka BSON
- Kod końcowy
Ale aby osiągnąć maksymalną funkcjonalność z MongoDB, trzeba znać klienta MongoDB i w tym artykule właśnie to omówimy.
Wymagania wstępne klienta MongoDB
Aby ten artykuł był pełny, musisz najpierw spełnić następujące wymagania wstępne.
Miej już IDE w swoim systemie.
Java Development Kit lub JDK w wersji 1.8 i nowsze zainstalowane z poprawnie skonfigurowanym JAVA_HOME.
Zainstalowany Docker lub MongoDB.
Apache Maven w wersji 3.5.3 i nowszych.
Architektura, którą stworzyliśmy i wykorzystaliśmy w tym przewodniku, jest jedną z najprostszych. Po uruchomieniu użytkownik może łatwo dodać dane i elementy do listy, po czym zostaną one automatycznie zaktualizowane w bazie danych.

Wraz z tym upewniliśmy się, że cała komunikacja między danymi a serwerem odbywa się w formacie JSON, a wszystkie dane są przechowywane w MongoDB.
Pierwsze kroki
Aby rozpocząć ten projekt, wykonaj czynności opisane poniżej.
Krok 1:tworzenie projektu w Maven
Pierwszym krokiem jest zawsze utworzenie nowego projektu i w tym celu skorzystaj z następującego kodu.
mvn io.quarkus:quarkus-maven-plugin:0.22.0:create -DprojectGroupId=org.acme -DprojectArtifactId=using-mongodb-client -DclassName="org.acme.rest.json.FruitResource" -Dpath="/fruits" -Dextensions="resteasy-jsonb,mongodb-client"
Po uruchomieniu powyższego polecenia IDE zaimportuje do systemu klientów JSON-B, MongoDb oraz RESTEasy/JAX-RS.
Kontynuuj krok 2.
Krok 2:Dodaj swoją pierwszą usługę spoczynkową JSON
In order to do this, use the code below.
package org.acme.rest.json;
import java.util.Objects;
public class Fruit {
private String name;
private String description;
public Fruit() {
}
public Fruit(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Fruit)) {
return false;
}
Fruit other = (Fruit) obj;
return Objects.equals(other.name, this.name);
}
@Override
public int hashCode() {
return Objects.hash(this.name);
}
}
W powyższym przykładzie najpierw stworzyliśmy owoc, który będzie później używany w programie.
Następnie musimy stworzyć plik org.acme.rest.json.FruitService, który będzie warstwą użytkownika naszej aplikacji. W tym celu użyj poniższego kodu.
package org.acme.rest.json;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
@ApplicationScoped
public class FruitService {
@Inject MongoClient mongoClient;
public List list(){
List list = new ArrayList<>();
MongoCursor cursor = getCollection().find().iterator();
try {
while (cursor.hasNext()) {
Document document = cursor.next();
Fruit fruit = new Fruit();
fruit.setName(document.getString("name"));
fruit.setDescription(document.getString("description"));
list.add(fruit);
}
} finally {
cursor.close();
}
return list;
}
public void add(Fruit fruit){
Document document = new Document()
.append("name", fruit.getName())
.append("description", fruit.getDescription());
getCollection().insertOne(document);
}
private MongoCollection getCollection(){
return mongoClient.getDatabase("fruit").getCollection("fruit");
}
}
Now we need to edit the org.acme.rest.json.FruitResource class to suit our needs. In order to do this, use the code below.
@Path("/fruits")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class FruitResource {
@Inject FruitService fruitService;
@GET
public List list() {
return fruitService.list();
}
@POST
public List add(Fruit fruit) {
fruitService.add(fruit);
return list();
}
}
Kontynuuj krok 3.
Krok 3:Konfiguracja bazy danych mongoDb
Składnia oraz standardowy kod do konfiguracji bazy danych mongoDb są podane poniżej.
# configure the mongoDB client for a replica set of two nodes quarkus.mongodb.connection-string = mongodb://mongo1:27017,mongo2:27017
W naszym przypadku użyjemy następującego kodu do konfiguracji bazy danych.
# configure the mongoDB client for a replica set of two nodes quarkus.mongodb.connection-string = mongodb://localhost:27017
Kontynuuj krok 4.
Krok 4:Uruchamianie skonfigurowanej bazy danych MongoDB
Następnym krokiem jest uruchomienie właśnie utworzonej bazy danych MongoDB. Aby to zrobić, użyj poniższego kodu.
docker run -ti --rm -p 27017:27017 mongo:4.0
Kontynuuj krok 5.
Krok 5:Tworzenie frontendu
Teraz, gdy cała praca na zapleczu aplikacji została zakończona, przyjrzyjmy się kodowi używanemu do kodowania frontonu naszej aplikacji.
package org.acme.rest.json;
import io.quarkus.mongodb.ReactiveMongoClient;
import io.quarkus.mongodb.ReactiveMongoCollection;
import org.bson.Document;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.List;
import java.util.concurrent.CompletionStage;
@ApplicationScoped
public class ReactiveFruitService {
@Inject
ReactiveMongoClient mongoClient;
public CompletionStage<List> list(){
return getCollection().find().map(doc -> {
Fruit fruit = new Fruit();
fruit.setName(doc.getString("name"));
fruit.setDescription(doc.getString("description"));
return fruit;
}).toList().run();
}
public CompletionStage add(Fruit fruit){
Document document = new Document()
.append("name", fruit.getName())
.append("description", fruit.getDescription());
return getCollection().insertOne(document);
}
private ReactiveMongoCollection getCollection(){
return mongoClient.getDatabase("fruit").getCollection("fruit");
}
}
package org.acme.rest.json;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.concurrent.CompletionStage;
@Path("/reactive_fruits")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ReactiveFruitResource {
@Inject ReactiveFruitService fruitService;
@GET
public CompletionStage<List> list() {
return fruitService.list();
}
@POST
public CompletionStage<List> add(Fruit fruit) {
fruitService.add(fruit);
return list();
}
}
W powyższym przykładzie korzystamy z reaktywnego klienta mongoDb, aby ułatwić tworzenie interfejsu.
Przejdź do kroku 6.
Krok 6:Uproszczenie klienta mongoDb przy użyciu kodeka BSON
Aby to zrobić, użyj poniższego kodu.
package org.acme.rest.json.codec;
import com.mongodb.MongoClient;
import org.acme.rest.json.Fruit;
import org.bson.*;
import org.bson.codecs.Codec;
import org.bson.codecs.CollectibleCodec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import java.util.UUID;
public class FruitCodec implements CollectibleCodec {
private final Codec documentCodec;
public FruitCodec() {
this.documentCodec = MongoClient.getDefaultCodecRegistry().get(Document.class);
}
@Override
public void encode(BsonWriter writer, Fruit fruit, EncoderContext encoderContext) {
Document doc = new Document();
doc.put("name", fruit.getName());
doc.put("description", fruit.getDescription());
documentCodec.encode(writer, doc, encoderContext);
}
@Override
public Class getEncoderClass() {
return Fruit.class;
}
@Override
public Fruit generateIdIfAbsentFromDocument(Fruit document) {
if (!documentHasId(document)) {
document.setId(UUID.randomUUID().toString());
}
return document;
}
@Override
public boolean documentHasId(Fruit document) {
return document.getId() != null;
}
@Override
public BsonValue getDocumentId(Fruit document) {
return new BsonString(document.getId());
}
@Override
public Fruit decode(BsonReader reader, DecoderContext decoderContext) {
Document document = documentCodec.decode(reader, decoderContext);
Fruit fruit = new Fruit();
if (document.getString("id") != null) {
fruit.setId(document.getString("id"));
}
fruit.setName(document.getString("name"));
fruit.setDescription(document.getString("description"));
return fruit;
}
}
Teraz użyjemy CodecProvider, aby połączyć to z już obecną klasą Fruit.
package org.acme.rest.json.codec;
import org.acme.rest.json.Fruit;
import org.bson.codecs.Codec;
import org.bson.codecs.configuration.CodecProvider;
import org.bson.codecs.configuration.CodecRegistry;
public class FruitCodecProvider implements CodecProvider {
@Override
public Codec get(Class clazz, CodecRegistry registry) {
if (clazz == Fruit.class) {
return (Codec) new FruitCodec();
}
return null;
}
}
Przejdź do kroku 7.
Krok 7:Kod końcowy
Ostateczny kod tej aplikacji będzie wyglądał mniej więcej tak.
package org.acme.rest.json;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
@ApplicationScoped
public class CodecFruitService {
@Inject MongoClient mongoClient;
public List list(){
List list = new ArrayList<>();
MongoCursor cursor = getCollection().find().iterator();
try {
while (cursor.hasNext()) {
list.add(cursor.next());
}
} finally {
cursor.close();
}
return list;
}
public void add(Fruit fruit){
getCollection().insertOne(fruit);
}
private MongoCollection getCollection(){
return mongoClient.getDatabase("fruit").getCollection("fruit", Fruit.class);
}
}
Wniosek
Teraz wiesz, jak skonfigurować i używać klienta MongoDB w swoim systemie. Śmiało wypróbuj te kody w swoim systemie i daj nam znać o swoich doświadczeniach.
Podsumowanie artykułu
Dowiedz się wszystkiego o kliencie MongoDB i o tym, jak możesz go skonfigurować w swoim systemie do różnych zastosowań. Czytaj dalej, aby dowiedzieć się więcej.
W ten sposób dochodzimy do końca „ Klient MongoDB” artykuł.
Nadchodzące partie szkolenia certyfikacyjnego MongoDB| Nazwa kursu | Data | |
|---|---|---|
| Szkolenie certyfikacyjne MongoDB | Zajęcia zaczynają się 4 czerwca 2022 4 czerwca SAT&SUN (partia weekendowa) | Wyświetl szczegóły |
| Szkolenie certyfikacyjne MongoDB | Zajęcia zaczynają się 6 sierpnia 2022 6 sierpnia SAT&SUN (partia weekendowa) | Wyświetl szczegóły |