Mongo Driver, BSON Document und manuelles Mapping
Filter, Upsert, Cursor-Iteration und Document-Mapping werden manuell implementiert.
Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.
Filter, Upsert, Cursor-Iteration und Document-Mapping werden manuell implementiert.
Spring Data leitet die Query aus dem Repository-Methodennamen ab und mappt ein @Document-Record.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 39 | 42% |
| Dokumentmodell, Mapping und Test | 3 | 2 | 32 | 19 | 33% |
| Repository | 1 | 1 | 31 | 10 | 6% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
MongoDB-Treiber/Mapping-Abhängigkeiten werden verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 42% |
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>24mongodb-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>mongodb-driver-legacy</artifactId>
<packaging>jar</packaging>
<name>MongoDB Driver Legacy</name>
<dependencies>
<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId></dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>24mongodb-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>spring-data-mongodb-modern</artifactId>
<packaging>jar</packaging>
<name>Spring Data MongoDB Modern</name>
<dependencies>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>Manuelles Mapping wird durch annotiertes Dokumentmodell ersetzt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyBook.java LegacyBookMapper.java LegacyBookMapperTest.java | BookDocument.java BookDocumentTest.java | Direktvergleich Semantische Ähnlichkeit: 33% |
package at.aydin.lab.mongodb.legacy;
public record LegacyBook(String id, String title, int year) {
}package at.aydin.lab.mongodb.legacy;
import org.bson.Document;
// Design Pattern: Data Mapper
// Zweck: Übersetzt manuell zwischen Fachobjekt und MongoDB Document.
public final class LegacyBookMapper {
public Document toDocument(LegacyBook b) {
return new Document("_id", b.id()).append("title", b.title()).append("year", b.year());
}
public LegacyBook fromDocument(Document d) {
return new LegacyBook(d.getString("_id"), d.getString("title"), d.getInteger("year"));
}
}package at.aydin.lab.mongodb.legacy;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class LegacyBookMapperTest {
@Test
void mapsDocument() {
var m = new LegacyBookMapper();
var b = new LegacyBook("1", "Java", 2026);
assertEquals(b, m.fromDocument(m.toDocument(b)));
}
}package at.aydin.lab.mongodb.modern;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document("books")
public record BookDocument(@Id String id, String title, int year) {
}package at.aydin.lab.mongodb.modern;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class BookDocumentTest {
@Test
void isImmutableDocument() {
assertEquals("Java", new BookDocument("1", "Java", 2026).title());
}
}Eigene Repository-Implementierung wird deklarativem Spring-Data-Repository gegenübergestellt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyBookRepository.java | BookRepository.java | Direktvergleich Semantische Ähnlichkeit: 6% |
package at.aydin.lab.mongodb.legacy;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.ReplaceOptions;
import org.bson.Document;
import java.util.ArrayList;
import java.util.List;
import static com.mongodb.client.model.Filters.gte;
// Design Pattern: Repository
// Zweck: Mongo-Driver, BSON-Filter und manuelles Mapping werden hinter einer fachlichen API gekapselt.
public final class LegacyBookRepository {
private final MongoCollection<Document> collection;
private final LegacyBookMapper mapper;
public LegacyBookRepository(MongoCollection<Document> collection, LegacyBookMapper mapper) {
this.collection = collection;
this.mapper = mapper;
}
public void save(LegacyBook book) {
collection.replaceOne(new Document("_id", book.id()), mapper.toDocument(book), new ReplaceOptions().upsert(true));
}
public List<LegacyBook> findByYearGreaterThanEqual(int year) {
List<LegacyBook> result = new ArrayList<>();
for (Document document : collection.find(gte("year", year))) {
result.add(mapper.fromDocument(document));
}
return List.copyOf(result);
}
}package at.aydin.lab.mongodb.modern;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.*;
// Design Pattern: Repository
// Zweck: Query-Ableitung ersetzt manuelle Document-/Cursor-Verarbeitung.
public interface BookRepository extends MongoRepository<BookDocument, String> {
List<BookDocument> findByYearGreaterThanEqual(int year);
}