mongodb für java-programmierer
DESCRIPTION
Der Talk wurde am 25.09.2013 auf der Java User Group Frankfurt gehalten und gibt einen Überblick und Einstieg in MongoDB aus der Sicht eines Java-Programmierers. Dabei werden folgende Themen behandelt: - Buzzword Bingo: NoSQL, Big Data, Horizontale Skalierung, CAP-Theorem, Eventual Consistency - Übersicht über MongoDB - Datenmanipulation: CRUD, Aggregation Framework, Map/Reduce - Indexing - Konsistenz beim Schreiben und Lesen von Daten - Java API & FrameworksTRANSCRIPT
![Page 1: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/1.jpg)
Uwe Seileruweseiler
MongoDB für Java-Programmierer
![Page 2: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/2.jpg)
About me
Big Data Nerd
TravelpiratePhotography Enthusiast
Hadoop Trainer MongoDB Author
![Page 3: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/3.jpg)
About usis a bunch of…
Big Data Nerds Agile Ninjas Continuous Delivery Gurus
Enterprise Java Specialists Performance Geeks
Join us!
![Page 4: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/4.jpg)
Agenda
• Buzzword Bingo
• Überblick über MongoDB
• Datenmanipulation
• Indexing
• Konsistenz beim Schreiben und Lesen von Daten
• Java API & Frameworks
![Page 5: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/5.jpg)
Buzzword Bingo
![Page 6: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/6.jpg)
NoSQL
![Page 7: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/7.jpg)
Klassifizierung von NoSQL
Key-Value StoresK V
K V
K V
K V
K V
11 1 1
1 11 11
11
Column Stores
Graph Databases Document Stores
_id_id_id
![Page 8: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/8.jpg)
Big Data
![Page 9: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/9.jpg)
Meine Lieblingsdefinition
![Page 10: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/10.jpg)
Die klassische Definition
• The 3 V’s of Big Data
•VarietyVolume Velocity
![Page 11: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/11.jpg)
«Big Data» != Hadoop
![Page 12: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/12.jpg)
Horizontale Skalierung
![Page 13: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/13.jpg)
Vertikale Skalierung
RAMCPU
Storage
![Page 14: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/14.jpg)
RAMCPU
Storage
Vertikale Skalierung
![Page 15: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/15.jpg)
RAMCPU
Storage
Vertikale Skalierung
![Page 16: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/16.jpg)
Horizontale Skalierung
RAMCPU
Storage
![Page 17: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/17.jpg)
Horizontale Skalierung
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
![Page 18: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/18.jpg)
RAMCPU
Storage
Horizontale Skalierung
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
![Page 19: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/19.jpg)
Das Problem mit der
Verteilung
![Page 20: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/20.jpg)
Partition
ToleranceTrotz
Knotenausfall funktioniert das System
Partition
ToleranceTrotz
Knotenausfall funktioniert das System
Das CAP Theorem
Consistency
Alle Knoten haben
jederzeit die gleichen
Informationen
Consistency
Alle Knoten haben
jederzeit die gleichen
Informationen
Availability
Jede Anfrage bekommt eine
Antwort
Availability
Jede Anfrage bekommt eine
Antwort
![Page 21: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/21.jpg)
Consistency
Alle Knoten haben
jederzeit die gleichen
Informationen
Consistency
Alle Knoten haben
jederzeit die gleichen
Informationen
Availability
Jeder Client kann immer
schreiben und lesen
Availability
Jeder Client kann immer
schreiben und lesen
Überblick über NoSQL Systeme
Partition Tolerance
Trotz Knotenausfall
funktioniert das System
Partition Tolerance
Trotz Knotenausfall
funktioniert das System
![Page 22: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/22.jpg)
Das Problem mit der
Konsistenz
![Page 23: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/23.jpg)
ACID
vs.
BASE
![Page 24: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/24.jpg)
ACID vs. BASE
Atomicity
Consistency
Isolation
Durability1983
RDBMS
![Page 25: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/25.jpg)
ACID ist ein gutes Konzept, aber es ist
kein in Stein gemeißeltes Gesetz!
ACID vs. BASE
![Page 26: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/26.jpg)
BasicallyAvailable
Soft State
Eventually consistent2008
NoSQL
ACID vs. BASE
![Page 27: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/27.jpg)
ACID
- Starke Konsistenz- Isolation- Zwei-Phasen-Commit- Komplexe Entwicklung - Zuverlässiger
BASE
- Schwache Konsistenz- Verfügbarkeit- "Fire-and-forget"- Leichtere Entwicklung- Schneller
ACID vs. BASE
![Page 28: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/28.jpg)
Überblick über MongoDB
![Page 29: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/29.jpg)
MongoDB ist eine …
• Dokumenten-basierte
• Open Source
• Performante
• Flexible
• Skalierbare
• Hochverfügbare
• Funktionsreiche…Datenbank
![Page 30: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/30.jpg)
Dokumenten-basierte Datenbank
• Nicht im Sinne einer Datenbank für PDF-oder Worddokumente…
![Page 31: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/31.jpg)
Open Source Datenbank
• MongoDB ist ein Open Source Projekt
• Auf GitHub– https://github.com/mongodb/mongo
• Steht unter der AGPL Lizenz
• Gestartet und gesponsert von MongoDB Inc. (früher: 10gen)
• Kommerzielle Lizenzen sind verfügbar
• Jeder darf mitmachen!– https://jira.mongodb.org
![Page 32: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/32.jpg)
Daten-lokalität
Performance
In-Memory Caching
In-Place Updates
![Page 33: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/33.jpg)
Flexibles Schema
RDBMS MongoDB
{
_id :
ObjectId("4c4ba5e5e8aabf3"),
employee_name: "Dunham, Justin",
department : "Marketing",
title : "Product Manager, Web",
report_up: "Neray, Graham",
pay_band: “C",
benefits : [
{ type : "Health",
plan : "PPO Plus" },
{ type : "Dental",
plan : "Standard" }
]
}
![Page 34: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/34.jpg)
Skalierbarkeit
Auto-Sharding
• Erhöhung der Kapazität wenn nötig
• Ausgelegt für Commodity Hardware
• Funktioniert mit Cloud-Architekturen
![Page 35: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/35.jpg)
Hochverfügbarkeit
• Automatische Replikation und Failover
• Unterstützung für mehrere Datenzentren
• Ausgelegt auf möglichst einfachen Betrieb
• Beständigkeit und Konsistenz der Daten
![Page 36: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/36.jpg)
MongoDB Architektur
![Page 37: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/37.jpg)
Reichhaltige Abfragen
![Page 38: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/38.jpg)
Aggregation Framework
![Page 39: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/39.jpg)
Map/Reduce
MongoDB DataGroup(k)
Sort(k)
Finalize(k, v)
Map()
emit(k,v)
Reduce(k, values)
Shard 1
Shard 2
Shard n
…
![Page 40: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/40.jpg)
Geoinformationen
![Page 41: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/41.jpg)
Treiber & Shell
Shell zur Interaktion mitder Datenbank
Treiber verfügbar fürdie populärstenProgrammiersprachenund Frameworks
> db.collection.insert({product:“MongoDB”, type:“Document Database”})> > db.collection.findOne(){
“_id” : ObjectId(“5106c1c2fc629bfe52792e86”),“product” : “MongoDB”“type” : “Document Database”
}
Java
Python
Perl
Ruby
Haskell
JavaScript
![Page 42: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/42.jpg)
Indeed.com Trends
Top Job Trends
1.HTML 5
2.MongoDB
3.iOS
4.Android
5.Mobile Apps
6.Puppet
7.Hadoop
8.jQuery
9.PaaS
10.Social Media
NoSQL TrendsLinkedIn Job Skills
MongoDB
Competitor 1
Competitor 2
Competitor 3
Competitor 4
Competitor 5
All Others
Google Search
MongoDB
Competitor 1
Competitor 2
Competitor 3
Competitor 4
Jaspersoft Big Data Index
Direct Real-Time Downloads
MongoDB
Competitor 1
Competitor 2
Competitor 3
![Page 43: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/43.jpg)
Datenmanipulation
![Page 44: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/44.jpg)
RDBMS MongoDBTabelle / View ➜ CollectionZeile ➜ DokumentIndex ➜ IndexJoin ➜ Eingebettetes
DokumentFremdschlüssel ➜ Referenziertes
DokumentPartition ➜ Shard
Terminologie
![Page 45: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/45.jpg)
Let’s have a look…
![Page 46: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/46.jpg)
// Anzeigen aller Datenbanken> show dbsdigg 0.078125GBenron 1.49951171875GB
// Wechsel in eine Datenbank> use blog
// Erneutes Anzeigen aller Datenbanken> show dbsdigg 0.078125GBenron 1.49951171875GB
Anlegen einer Datenbank
![Page 47: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/47.jpg)
// Anzeigen aller Collections> show collections
// Einfügen eines Benutzers> db.user.insert(
{ name : “Sheldon“, mail : “[email protected]“ }
)
Anlegen einer Collection I
Beim Einfügen erfolgt kein Feedback über den Erfolg der Operation, Abfrage über:
db.runCommand( { getLastError: 1} )
![Page 48: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/48.jpg)
// Anzeigen aller Collections> show collectionssystem.indexesuser
// Anzeigen aller Datenbanken> show dbsblog 0.0625GBdigg 0.078125GBenron 1.49951171875GB
Anlegen einer Collection II
Datenbank und Collection werden automatisch beim ersten Insert anlegt.
![Page 49: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/49.jpg)
// Anzeigen des ersten Dokuments> db.user.findOne(){
"_id" : ObjectId("516684a32f391f3c2fcb80ed"),"name" : "Sheldon","mail" : "[email protected]"
}
// Alle Dokumente einer Collection anzeigen> db.user.find(){
"_id" : ObjectId("516684a32f391f3c2fcb80ed"),"name" : "Sheldon","mail" : "[email protected]"
}
Lesen aus einer Collection
![Page 50: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/50.jpg)
// Filtern von bestimmten Dokumenten> db.user.find( { name : ”Penny” } ){
"_id" : ObjectId("5166a9dc2f391f3c2fcb80f1"),"name" : "Penny","mail" : "[email protected]"
}
// Nur bestimmte Felder anzeigen> db.user.find( { name : ”Penny” },
{_id: 0, mail : 1} )
{ "mail" : "[email protected]" }
Filtern von Dokumenten
![Page 51: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/51.jpg)
_id
• _id ist der primäre Schlüssel in MongoDB
• Index auf _id wird automatisch erzeugt
• Wenn nicht anders angegeben, handelt es sich dabei um eine ObjectId
• _id kann auch selbst beim Einfügen von Dokumenten vergeben werden, jeder einzigartige unveränderbare Wert kann dabei verwendet werden
![Page 52: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/52.jpg)
ObjectId
• Eine ObjectId ist ein spezieller 12 Byte Wert
• Ihre Einzigartigkeit über den gesamten Cluster ist durch die Zusammensetzung garantiert:
ObjectId("50804d0bd94ccab2da652599")|-------------||---------||-----||----------|
ts mac pid inc
![Page 53: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/53.jpg)
// Benutzen eines Cursors für die Dokumente> var myCursor = db.user.find( )
// Nächstes Dokument holen und Mail anzeigen> var myDocument =
myCursor.hasNext() ? myCursor.next() : null;
> if (myDocument) { printjson(myDocument.mail); }
// Restliche Dokumente anzeigen> myCursor.forEach(printjson);
Cursor
In der Shell werden per Default 20 Dokumente angezeigt.
![Page 54: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/54.jpg)
// Oder-Verknüpfung> db.user.find(
{$or : [ { name : “Sheldon“ }, { mail : [email protected] }
] } )
// Und-Verknüpfung> db.user.find(
{$and : [ { name : “Sheldon“ }, { mail : [email protected] }
] } )
Logische Verknüpfungen
![Page 55: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/55.jpg)
// Sortieren von Dokumenten> db.user.find().sort( { name : 1 } ) // Aufsteigend> db.user.find().sort( { name : -1 } ) // Absteigend
// Ergebnismenge limitieren> db.user.find().limit(3)
// Ergebnisdokumente überspringen> db.user.find().skip(2)
// Kombination der Methoden> db.user.find().skip(2).limit(3)
Ergebnismengen anpassen
![Page 56: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/56.jpg)
// Update der Mail-Adresse (So bitte nicht!)> db.user.update( { name : “Sheldon“ },
{ mail : “[email protected]“ } )
// Anzeige des Updatesdb.user.findOne(){
"_id" : ObjectId("516684a32f391f3c2fcb80ed"),"mail" : "[email protected]"
}
Update von Dokumenten I
Aufpassen beim Update von Dokumenten!
![Page 57: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/57.jpg)
// Löschen des Dokuments> db.user.remove(
{ mail : “[email protected]“ } )
// Löschen aller Dokumente> db.user.remove()
// Löschen von Dokumenten mittels Bedingung> db.user.remove(
{ mail : /.*mother.com$/ } )
// Löschen nur des ersten passenden Dokuments> db.user.remove( { mail : /.*.com$/ }, true )
Löschen von Dokumenten
![Page 58: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/58.jpg)
// Update der Mail-Adresse (Jetzt aber richtig!)> db.user.update( { name : “Sheldon“ },
{ $set : { mail : “[email protected]“
} } )
// Anzeige des Updatesdb.user.find(name : “Sheldon“){
"_id" : ObjectId("5166ba122f391f3c2fcb80f5"),"mail" : "[email protected]","name" : "Sheldon"
}
Update von Dokumenten II
![Page 59: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/59.jpg)
// Hinzufügen eines Arrays> db.user.update( {name : “Sheldon“ },
{ $set : {enemies : [ { name : “Wil Wheaton“ },
{ name : “Barry Kripke“ } ]
} } )
// Hinzufügen eines Wertes zum Array> db.user.update( { name : “Sheldon“},
{ $push : {enemies : { name : “Leslie Winkle“}
} } )
Hinzufügen zu Arrays
![Page 60: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/60.jpg)
// Löschen eines Wertes aus dem Array> db.user.update( { name : “Sheldon“ },
{$pull : {enemies : {name : “Barry Kripke“ }
} } )
// Löschen des kompletten Feldes> db.user.update( {name : “Sheldon“},
{$unset : {enemies : 1}})
Löschen aus Arrays
![Page 61: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/61.jpg)
// Hinzufügen eines Subdokuments> db.user.update( { name : “Sheldon“}, {
$set : { mother :{ name : “Mary Cooper“, residence : “Galveston, Texas“, religion : “Evangelical Christian“ }}})
{"_id" : ObjectId("5166cf162f391f3c2fcb80f7"),"mail" : "[email protected]","mother" : {
"name" : "Mary Cooper","residence" : "Galveston, Texas","religion" : "Evangelical Christian"
},"name" : "Sheldon"
}
Einfügen eines Subdokuments
![Page 62: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/62.jpg)
// Abfrage des Namens der Mutter> db.user.find( { name : “Sheldon“},
{“mother.name“ : 1 } )
{"_id" : ObjectId("5166cf162f391f3c2fcb80f7"),"mother" : {
"name" : "Mary Cooper"}
}
Abfragen auf Subdokumenten
Zusammengesetzte Feldnamen müssen in “…“ stehen!
![Page 63: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/63.jpg)
Für Felder:$inc$rename$set$unset
Bitweise:$bit
Isolation:$isolated
Übersicht über alle Update-Operatoren
Für Arrays:$addToSet$pop$pullAll$pull$pushAll$push$each (Modifier)$slice (Modifier)$sort (Modifier)
![Page 64: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/64.jpg)
Createhttp://docs.mongodb.org/manual/core/create/
Readhttp://docs.mongodb.org/manual/core/read/
Updatehttp://docs.mongodb.org/manual/core/update/
Deletehttp://docs.mongodb.org/manual/core/delete/
Dokumentation
![Page 65: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/65.jpg)
Das Aggregation Framework
• Wurde eingeführt, um Aggregationen ohne Map/Reduce berechnen zu können
• Framework von Methoden & Operatoren– Deklarativ– Kein eigener JavaScript-Code mehr nötig– Framework kann erweitert werden
• Implementiert in C++– Overhead der JavaScript-Engine wird vermieden– Höhere Performance
![Page 66: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/66.jpg)
Aggregation Pipeline
{document}
Pipeline Operator
Pipeline Operator
Pipeline Operator
Ergebnis{
sum: 337avg: 24,53min: 2max : 99
}
![Page 67: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/67.jpg)
Aggregation Pipeline
• Verarbeitet einen Strom von Dokumenten– Eingabe ist eine Collection– Ausgabe ist ein Ergebnisdokument
• Aneinanderreihung von Pipeline-Operatoren– Jede Stufe filtert oder transformiert die Dokumente– Ausgabedokumente einer Stufe sind die Eingabe-
dokumente der nächsten Stufe
![Page 68: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/68.jpg)
> db.tweets.aggregate(
{ $pipeline_operator_1 },
{ $pipeline_operator_2 },
{ $pipeline_operator_3 },
{ $pipeline_operator_4 },
...
);
Aufruf
![Page 69: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/69.jpg)
// Alte Bekannte*
$match
$sort
$limit
$skip
Pipeline Operatoren
// Neue Freunde
$project
$group
$unwind
* Aus der Abfragefunktionalität
![Page 70: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/70.jpg)
// Collection mit Tweets{
"_id" : ObjectId("4fb9fb91d066d657de8d6f39"),"text" : "I can't wait for #BoardwalkEmpire","in_reply_to_status_id" : null,"retweet_count" : null,"contributors" : null,"created_at" : "Thu Sep 02 18:11:24 +0000 2010",
…"user" : {
"friends_count" : 204,…
"followers_count" : 24,"id" : 64054560,…
},…}
Aggregation Framework I
![Page 71: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/71.jpg)
// Finde die Top-3-Twitterer nach Followern
> db.tweets.aggregate({ $project : {name : "$user.name",
follower_count : "$user.followers_count"}},{ $group : {_id : {name : "$name"},
follower_count : {$max : "$follower_count"}}},{ $sort : {follower_count : -1}},{ $limit: 3}
);
Aggregation Framework II
![Page 72: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/72.jpg)
// Finde die Top-3-Links aus Tweets
> db.tweets.aggregate({ $project : {_id: 0, inhalt_des_tweets :
"$text", links : "$entities.urls.url" } },{ $unwind : "$links" },{ $group : { _id : "$links",
anzahl : {$sum : 1} } },{ $sort : {anzahl : -1} },{ $limit : 3 }
);
Aggregation Framework III
![Page 73: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/73.jpg)
Was ist Map/Reduce?
• Programmiermodel aus der funktionalen Welt
• Framework zur– parallelen Verarbeitung– von großen Datenmengen– mittels verteilter Systeme
• Populär geworden durch Google– Wird zur Berechnung des Suchindex verwendet,
welcher Seiten zu Keywords zuordnet (Page Rank)– http://research.google.com/archive/mapreduce.html
![Page 74: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/74.jpg)
Map/Reduce mit MongoDB
MongoDB Daten group(k)
sort(k)
finalize(k, v)
k, v
map()emit(k,v)
• Iteriert über alle Dokumente
reduce(k, values)k, v
• Input = Output• Kann mehrfach laufen
Shard 1
Shard 2
Shard n
…
![Page 75: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/75.jpg)
Word Count: Problemstellung
INPUT MAPPER GROUP/SORT REDUCER OUTPUT
{ MongoDB
uses MapReduce
}
{There is a
map phase}
{There is a
reduce phase
}
a: 2is: 2
map: 1
mapreduce: 1mongodb: 1
phase: 2
reduce: 1there: 2uses: 1
Problem:Wie häufig kommt ein Wort in allen Dokumenten vor?
![Page 76: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/76.jpg)
// Beispiel: Twitter-Datenbank mit Tweets> db.tweets.findOne(){
"_id" : ObjectId("4fb9fb91d066d657de8d6f38"),"text" : "RT @RevRunWisdom: The bravest thing that men do is
love women #love","created_at" : "Thu Sep 02 18:11:24 +0000 2010",
…
"user" : {"friends_count" : 0,"profile_sidebar_fill_color" : "252429","screen_name" : "RevRunWisdom","name" : "Rev Run",
},…
Word Count: Tweets
![Page 77: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/77.jpg)
// Map Funktion mit Bereinigung der Datenmap = function() {
this.text.split(' ').forEach(function(word) {
// Entfernen von Whitespaceword = word.replace(/\s/g, "");
// Entfernen alle Non-Word-Charactersword = word.replace(/\W/gm,"");
// Finally emit the cleaned up wordif(word != "") {
emit(word, 1)}
});};
Word Count: Map Funktion
![Page 78: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/78.jpg)
// Reduce Funktionreduce = function(key, values) {
return values.length;};
Word Count: Reduce Funktion
![Page 79: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/79.jpg)
// Anzeigen des Ergebnisses in der Konsole> db.tweets.mapReduce(map, reduce, { out : { inline : 1 } } );
// Speichern des Ergebnisses in einer Collection> db.tweets.mapReduce(map, reduce, { out : "tweets_word_count"} );
{"result" : "tweets_word_count","timeMillis" : 19026,"counts" : {
"input" : 53641,"emit" : 559217,"reduce" : 102057,"output" : 131003
},"ok" : 1,
}
Word Count: Aufruf
![Page 80: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/80.jpg)
// Ausgeben der 10 häufigsten Wörter in Tweets> db.tweets_word_count.find().sort({"value" : -1}).limit(10)
{ "_id" : "Miley", "value" : 31 }{ "_id" : "mil", "value" : 31 }{ "_id" : "andthenihitmydougie", "value" : 30 }{ "_id" : "programa", "value" : 30 }{ "_id" : "Live", "value" : 29 }{ "_id" : "Super", "value" : 29 }{ "_id" : "cabelo", "value" : 29 }{ "_id" : "listen", "value" : 29 }{ "_id" : "Call", "value" : 28 }{ "_id" : "DA", "value" : 28 }
Word Count: Ergebnis
![Page 81: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/81.jpg)
Indexing
![Page 82: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/82.jpg)
Indexe in MongoDB sind B-Trees
![Page 83: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/83.jpg)
Abfragen, Einfügen und Löschen: O(log(n))
![Page 84: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/84.jpg)
Fehlende oder nicht optimale Indexe sind
das häufigste vermeidbare MongoDB Performance-Problem
![Page 85: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/85.jpg)
// Anlegen eines Index, wenn er noch nicht existiert> db.recipes.createIndex({ main_ingredient: 1 })
// Der Client merkt sich den Index und wirft keinen Fehler> db.recipes.ensureIndex({ main_ingredient: 1 })
* 1 für aufsteigend, -1 für absteigend
Wie lege ich Indexe an?
![Page 86: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/86.jpg)
// Mehrere Felder (Compound Key Indexes)> db.recipes.ensureIndex({
main_ingredient: 1,calories: -1
})
// Arrays mit Werten (Multikey Indexes){
name: 'Chicken Noodle Soup’,ingredients : ['chicken', 'noodles']
}
> db.recipes.ensureIndex({ ingredients: 1 })
Was kann indexiert werden?
![Page 87: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/87.jpg)
// Subdokumente{
name : 'Apple Pie', contributor: {
name: 'Joe American',id: 'joea123'
}}
db.recipes.ensureIndex({ 'contributor.id': 1 })
db.recipes.ensureIndex({ 'contributor': 1 })
Was kann indexiert werden?
![Page 88: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/88.jpg)
// Auflisten aller Indexe einer Collection
> db.recipes.getIndexes()
> db.recipes.getIndexKeys()
// Löschen eines Index
> db.recipes.dropIndex({ ingredients: 1 })
// Löschen und Neuerzeugung aller Indexe
db.recipes.reIndex()
// Defaultindex auf _id
Wie verwalte ich Indexe?
![Page 89: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/89.jpg)
Weitere Optionen
• Unique Indexe– Nur eindeutige Werte erlaubt
• Sparse Indexe– Für Felder, die nicht in allen Dokumenten
vorkommen
• Geospatial Indexe– Zur Modellierung von Geoinformationen
• TTL Collections – Verfallen nach x Sekunden
![Page 90: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/90.jpg)
// Der Name eines Rezepts muss eindeutig sein
> db.recipes.ensureIndex( { name: 1 }, { unique: true } )
// Erzwingen eines Index auf einer Collection mit nicht eindeutigen // Namen – Die Duplikate werden gelöscht
> db.recipes.ensureIndex(
{ name: 1 },
{ unique: true, dropDups: true }
)
* dropDups bitte mit sehr viel Vorsicht anwenden!
Unique Indexe
![Page 91: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/91.jpg)
// Nur Dokumente mit dem Feld calories werden indexiert
> db.recipes.ensureIndex(
{ calories: -1 },
{ sparse: true }
)
// Kombination mit einem Unique Index möglich
> db.recipes.ensureIndex(
{ name: 1 , calories: -1 },
{ unique: true, sparse: true }
)
* Fehlende Felder werden im Index als null gespeichert
Sparse Indexe
![Page 92: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/92.jpg)
// Hinzufügen von Längen- und Breitengraden
{
name: ‚codecentric Frankfurt’,
loc: [ 50.11678, 8.67206]
}
// Indexierung der Koordinaten
> db.locations.ensureIndex( { loc : '2d' } )
// Abfrage nach Orten in der Nähe von codecentric Frankfurt
> db.locations.find({
loc: { $near: [ 50.1, 8.7 ] }
})
Geospatial Indexe
![Page 93: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/93.jpg)
// Die Dokumente müssen ein Datum des Typs BSON UTC haben
{ ' submitted_date ' : ISODate('2012-10-12T05:24:07.211Z'), … }
// Dokumente werden automatisch nach 'expireAfterSeconds' // Sekunden gelöscht
> db.recipes.ensureIndex(
{ submitted_date: 1 },
{ expireAfterSeconds: 3600 }
)
TTL Collections
![Page 94: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/94.jpg)
Limitierungen von Indexen
• Collections können nicht mehr als 64 Indexe haben.
• Indexschlüssel können nicht größer als 1024 Byte sein.
• Der Name eines Index inklusive Namespace muss kleiner als 128 Zeichen sein.
• Abfragen können nur einen Index verwenden– Ausnahme: Abfragen mit $or
• Indexe verbrauchen Speichern und verlangsamen das Schreiben von Daten
![Page 95: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/95.jpg)
Optimierung von Indexen
![Page 96: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/96.jpg)
Vorgehensweise
1. Langsame Abfragen identifizieren
2. Mittels explain() mehr über die langsame Abfrage herausfinden
3. Anlegen der Indexe auf den abgefragten Feldern
4. Optimierung der Abfragen anhand der verwendeten Indexe
![Page 97: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/97.jpg)
> db.setProfilingLevel( n , slowms=100ms )
n=0: Profiler abgeschaltet
n=1: Protokollieren aller Abfragen langsamer als slowms
n=2: Protokollieren aller Operationen
> db.system.profile.find()
* Die Collection profile ist eine Capped Collection und hat daher eine feste Anzahl von Einträgen
1. Langsame Abfragen identifizieren
![Page 98: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/98.jpg)
> db.recipes.find( { calories:
{ $lt : 40 } }
).explain( )
{
"cursor" : "BasicCursor" ,
"n" : 42,
"nscannedObjects” : 53641
"nscanned" : 53641,
...
"millis" : 252,
...
}
* Keine Verwendung von Plänen aus dem Cache und erneuten Ausführungen
2. Benutzung von explain()
![Page 99: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/99.jpg)
2. Metriken des Executionplans I
• Cursor– Der Typ des Cursors. BasicCursor bedeutet, dass
kein Index benutzt wurde
• n – Die Anzahl der passenden Dokumente
• nscannedObjects– Die Anzahl der gescannten Dokumente
• nscanned– Die Anzahl der untersuchten Einträge
(Indexeinträge oder Dokumente)
![Page 100: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/100.jpg)
2. Metriken des Executionplans II
• millis– Ausführungszeit der Abfrage
• Komplette Referenz unter – http://docs.mongodb.org/manual/reference/explain
Das Verhältnis der gescannten zu den gefundenen Dokumenten sollte möglichst nahe an 1 sein!
![Page 101: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/101.jpg)
3. Anlegen der Indexe auf den abgefragten Feldern
![Page 102: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/102.jpg)
// Bei folgendem Index…
> db.collection.ensureIndex({ a:1, b:1 , c:1, d:1 })
// … können die folgenden Sortieroperationen und Abfragen den // Index benutzen
> db.collection.find( ).sort({ a:1 })
> db.collection.find( ).sort({ a:1, b:1 })
> db.collection.find({ a:4 }).sort({ a:1, b:1 })
> db.collection.find({ b:5 }).sort({ a:1, b:1 })
4. Optimierung der Abfragen anhand der verwendeten Indexe
![Page 103: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/103.jpg)
// Bei folgendem Index…
> db.collection.ensureIndex({ a:1, b:1, c:1, d:1 })
// … können diese Abfragen ihn nicht verwenden
> db.collection.find( ).sort({ b: 1 })
> db.collection.find({ b: 5 }).sort({ b: 1 })
4. Optimierung der Abfragen anhand der verwendeten Indexe
![Page 104: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/104.jpg)
// Bei folgendem Index…
> db.recipes.ensureIndex({ main_ingredient: 1, name: 1 })
// … verwendet diese Abfrage nur Felder des Index
> db.recipes.find(
{ main_ingredient: 'chicken’ },
{ _id: 0, name: 1 }
)
// Das Feld indexOnly bei explain() zeigt dies an
> db.recipes.find(
{ main_ingredient: 'chicken' },
{ _id: 0, name: 1 }
).explain()
{
"indexOnly": true,
}
4. Optimierung der Abfragen anhand der verwendeten Indexe
![Page 105: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/105.jpg)
// MongoDB mitteilen, welcher Index verwendet werden soll
> db.recipes.find({
calories: { $lt: 1000 } }
).hint({ _id: 1 })
// Die Verwendung von Indexen ausschalten (z.B. zur Performance-// messung
> db.recipes.find(
{ calories: { $lt: 1000 } }
).hint({ $natural: 1 })
Index manuell angeben
![Page 106: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/106.jpg)
Häufige Stolperfallen bei Indexen
![Page 107: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/107.jpg)
// MongoDB kann nur einen Index pro Abfrage verwenden
> db.collection.ensureIndex({ a: 1 })
> db.collection.ensureIndex({ b: 1 })
// Nur einer der beiden obigen Indexe wird verwendet
> db.collection.find({ a: 3, b: 4 })
Mehrere Index verwenden
![Page 108: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/108.jpg)
// Zusammengesetzte Indexe sind im Allgemeinen sehr effektiv
> db.collection.ensureIndex({ a: 1, b: 1, c: 1 })
// Aber nur wenn die Abfrage ein Präfix des Indexes ist…
// Diese Abfrage kann den Index nicht effektiv verwenden
db.collection.find({ c: 2 })
// …diese Abfrage hingegen schon
db.collection.find({ a: 3, b: 5 })
Zusammengesetzte Indexe
![Page 109: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/109.jpg)
// Folgendes Feld hat nur sehr wenige eindeutige Werte
> db.collection.distinct('status’)
[ 'new', 'processed' ]
// Ein Index auf diesem Feld bringt nur sehr wenig
> db.collection.ensureIndex({ status: 1 })
> db.collection.find({ status: 'new' })
// Besser ist ein zusammengesetzter Index zusammen mit einem // anderen Feld
> db.collection.ensureIndex({ status: 1, created_at: -1 })
> db.collection.find(
{ status: 'new' }
).sort({ created_at: -1 })
Indexe mit geringer Selektivität
![Page 110: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/110.jpg)
> db.users.ensureIndex({ username: 1 })
// Abfragen mit regulären Ausdrücken, die linksgebunden sind // können den Index verwenden
> db.users.find({ username: /^joe smith/ })
// Generische Abfragen mit regulären Ausdrücken hingegen nicht…
> db.users.find({username: /smith/ })
// Ebenso nicht schreibungsunabhängige Abfragen…
> db.users.find({ username: /Joe/i })
Reguläre Ausdrücke & Indexe
![Page 111: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/111.jpg)
// Bei Negationen können Indexe nicht verwendet werden
> db.things.ensureIndex({ x: 1 })
// z.B. bei Abfragen mit not equal
> db.things.find({ x: { $ne: 3 } })
// …oder Abfragen mit not in
> db.things.find({ x: { $nin: [2, 3, 4 ] } })
// …oder Abfragen mit dem $not Operator
> db.people.find({ name: { $not: 'John Doe' } })
Negation
![Page 112: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/112.jpg)
Konsistenz beim Schreiben und Lesen von Daten
![Page 113: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/113.jpg)
Starke Konsistenz
![Page 114: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/114.jpg)
Verzögerte Konsistenz
![Page 115: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/115.jpg)
Write Concern - Schreibmodi
• Bestätigung durch das Netzwerk
• Bestätigung durch MongoDB
• Bestätigung durch das Journal
• Bestätigung durch Secondaries
• Bestätigung durch Tagging
![Page 116: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/116.jpg)
Bestätigung durch das Netzwerk„Fire and forget“
![Page 117: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/117.jpg)
Bestätigung durch MongoDB Wait for Error
![Page 118: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/118.jpg)
Bestätigung durch das JournalWait for Journal Sync
![Page 119: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/119.jpg)
Bestätigung durch SecondariesWait for Replication
![Page 120: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/120.jpg)
Tagging beim Schreiben
• Verfügbar seit Version 2.0
• Ermöglicht stärkere Kontrolle woher Daten gelesen und wohin geschrieben werden
• Jeder Knoten kann mehrere Tags haben– tags: {dc: "ny"}– tags: {dc: "ny", subnet: „192.168", rack: „row3rk7"}
• Erlaubt das Anlegen für Regeln für das Write Concern pro Replikaset
• Anpassung der Regeln ohne Codeänderung
![Page 121: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/121.jpg)
{
_id : "mySet",
members : [
{_id : 0, host : "A", tags : {"dc": "ny"}},
{_id : 1, host : "B", tags : {"dc": "ny"}},
{_id : 2, host : "C", tags : {"dc": "sf"}},
{_id : 3, host : "D", tags : {"dc": "sf"}},
{_id : 4, host : "E", tags : {"dc": "cloud"}}],
settings : {
getLastErrorModes : {
allDCs : {"dc" : 3},
someDCs : {"dc" : 2}} }
}
> db.blogs.insert({...})
> db.runCommand({getLastError : 1, w : "someDCs"})
Beispiel für Tagging
![Page 122: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/122.jpg)
Bestätigung durch alle DatenzentrenWait for Replication (Tagging)
![Page 123: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/123.jpg)
// Wait for network acknowledgement
> db.runCommand( { getLastError: 1, w: 0 } )
// Wait for error (Default)
> db.runCommand( { getLastError: 1, w: 1 } )
// Wait for journal sync
> db.runCommand( { getLastError: 1, w: 1, j: "true" } )
// Wait for replication
> db.runCommand( { getLastError: 1, w: “majority" } ) // Mehrheit
> db.runCommand( { getLastError: 1, w: 3 } ) // # der Secondaries
Setzen des Write Concerns
![Page 124: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/124.jpg)
Modi zum Lesen von Daten (Seit Version 2.2)
• Nur Primary (primary)
• Primary bevorzugt (primaryPreferred)
• Nur Secondaries (secondary)
• Secondaries bevorzugt (secondaryPreferred)
• Nähester Knoten (Nearest)
Falls mehr als ein Knoten möglich ist, wird immer der näheste Knoten zum Lesen der Daten verwendet. (Alle Modi außer Primary)
![Page 125: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/125.jpg)
Nur Primaryprimary
Read
![Page 126: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/126.jpg)
Primary bevorzugtprimaryPreferred
Read
Read
![Page 127: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/127.jpg)
Nur Secondariessecondary
Read
Read
![Page 128: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/128.jpg)
Secondaries bevorzugtsecondaryPreferred
Read
Read
Read
![Page 129: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/129.jpg)
Nähester Knotennearest
Read
Read
Read
![Page 130: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/130.jpg)
Tagging beim Lesen
• Ermöglicht eine individuelle Kontrolle woher Daten gelesen werden– z.B. { "disk": "ssd", "use": "reporting" }
• Lässt sich mit den Standard-Lese-Modi kombinieren– Außer dem Modus „Nur Primary“
![Page 131: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/131.jpg)
// Nur Primary
> cursor.setReadPref( “primary" )
// Primary bevorzugt
> cursor.setReadPref( “primaryPreferred" )
….
// Nur Secondaries mit Tagging
> cursor.setReadPref( “secondary“, [ rack : 2 ] )
Setzen der Read Preference
Aufruf der Methode auf dem Cursor muss vor dem Lesen der Dokumente erfolgen
![Page 132: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/132.jpg)
Java API & Frameworks
![Page 133: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/133.jpg)
Übersicht
Hibernate OGM
Spring Data MongoDB
MongoDB Java Driver
Morphia
JPA
JDBC
MongoDB
Jongo
![Page 134: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/134.jpg)
MongoDB Java Treiber
![Page 135: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/135.jpg)
MongoDB Treiber
• Ein Wire Protokoll für alle Programmiersprachen
• Eine Implementierung des Treibers pro Sprache
• Hauptaufgaben:– Konvertierung der sprachspezifischen
Datenstrukturen nach BSON– Generierung der ObjectId für das Feld _id
![Page 136: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/136.jpg)
MongoDB Java Treiber
• Ein JAR ohne weitere Abhängigkeiten:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.3</version>
</dependency>
Verfügbar auf Github:https://github.com/mongodb/mongo-java-driver
![Page 137: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/137.jpg)
Verbindungsaufbauimport com.mongodb.MongoClient;
// Default: localhost:27017
mongo = new MongoClient();
// Replica set
mongo = new MongoClient(Arrays.asList(
new ServerAddress("replicant01", 10001),
new ServerAddress("replicant02", 10002),
new ServerAddress("replicant03", 10003)
));
// Sharding: mongos server
mongo = new MongoClient("mongos01", 4711);
![Page 138: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/138.jpg)
Zugriff auf Datenbank und Collection
import com.mongodb.DB;
import com.mongodb.DBCollection;
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("foo");
![Page 139: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/139.jpg)
Dokument einfügen
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
// insert document
DBObject doc = new BasicDBObject();
doc.put("date", new Date());
doc.put("i", 42);
collection.insert(doc);
![Page 140: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/140.jpg)
Dokumente abfragen
import com.mongodb.DBCursor;
DBCursor cursor;
cursor = collection.find(); // all documents
// documents w/ {i: 42}
cursor = collection.find( new BasicDBObject("i", 42) );
document = cursor.next(); ...
![Page 141: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/141.jpg)
> db.order.find( {"items.quantity": ? } )
Beispiel: Bestellung
![Page 142: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/142.jpg)
Beispiel: Bestellung IDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject order;List<DBObject> items = new ArrayList<DBObject>();DBObject item;
// orderorder = new BasicDBObject();order.put("date", new Date());order.put("custInfo" , „Sheldon Cooper");// itemsitem = new BasicDBObject();item.put("quantity", 1);item.put("price", 47.11);item.put("desc", "Item #1");items.add(item);item = new BasicDBObject();item.put("quantity", 2);item.put("price", 42.0);item.put("desc", "Item #2");items.add(item);order.put("items", items);
collection.insert(order);
![Page 143: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/143.jpg)
Beispiel: Bestellung II
DB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject query;DBObject document;DBCursor cursor;
query = new BasicDBObject("items.quantity", 2);cursor = collection.find(query);
while ( cursor.hasNext() ) {document = cursor.next();println(document);
}
![Page 144: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/144.jpg)
Jongo
![Page 145: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/145.jpg)
Kurzüberblick über Jongo
Entwickler Benoît Guérout, Yves AmsellemLizenz Apache License, Version 2.0Dokumentation http://jongo.org/Hauptmerkmale • Object/Document Mapping
• Eigene Query API
![Page 146: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/146.jpg)
Query in Java as in Mongo Shell
![Page 147: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/147.jpg)
Jongo: Object Mapping
public class Order {private ObjectId id;private Date date;@JsonProperty("custInfo") private String customerInfo;List<Item> items; …
}
public class Item {private int quantity;private double price;@JsonProperty("desc") private String description;…
}
![Page 148: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/148.jpg)
Jongo: Abfragen
// Java driver APIMongoClient mc = new MongoClient();DB db = mc.getDB("odm_jongo");// Jongo API entry pointJongo jongo = new Jongo(db);MongoCollection orders = jongo.getCollection("order");
// no DAO neededIterable<Order> result =
orders.find("{\"items.quantity\": #}", 2).as(Order.class);// supports projectionIterable<X> result =
orders.find().fields("{_id:0, date:1, custInfo:1}").as(X.class);
![Page 149: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/149.jpg)
Morphia
![Page 150: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/150.jpg)
Kurzüberblick über Morphia
Entwickler Scott Hernandez, James GreenLizenz Apache License, Version 2.0Dokumentation https://github.com/jmkgreen/morph
ia/wiki/OverviewHauptmerkmale • Object/Document Mapping
• Eigene Query API• Unterstützung für DAO‘s
![Page 151: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/151.jpg)
Morphia: Object Mapping
public class Order {@Id private ObjectId id;private Date date;@Property("custInfo") private String customerInfo;@Embedded List<Item> items;...
}public class Item {
private int quantity;private double price;@Property("desc") private String description;...
}
![Page 152: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/152.jpg)
Morphia: Abfragen
public class OrderDao extends BasicDAO<Order, ObjectId> {
List<Order> findByItemsQuantity(int quantity) {returnfind( createQuery().filter("items.quantity", quantity)).asList();
}List<Order> findByItemsPriceGreaterThan(double price) {
returnfind(
createQuery().field("items.price").greaterThan(price) ).asList();
}…
}
![Page 153: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/153.jpg)
Morphia: Eigene Syntax für Abfragen
Morphia Mongo Query= $eq!=, <> $neq>, <, >=,<= $gt, $lt, $gte, $ltein, nin $in, $ninelem $elemMatch… ….
![Page 154: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/154.jpg)
Spring Data MongoDB
![Page 155: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/155.jpg)
Kurzüberblick über Spring Data MongoDB
Hersteller VMware / SpringSourceLizenz Apache License, Version 2.0Dokumentation http://www.springsource.org/spring
-data/mongodbHauptmerkmale • Repository Support
• Object/Document Mapping• Templating
![Page 156: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/156.jpg)
Einheitliche Architektur für relationale Datenbanken sowie für unterstützte NoSQL-Stores
Spring Data
RDBMS MongoDB Neo4j …
Spring Data JPA
CrudRepository PagingAndSortingRepository
JpaRepository
JPA
JDBC
Spring Data MongoDB
MongoRepository
MongoTemplate
Spring DataNeo4j
Spring Data…
GraphRepository
Neo4jTemplate
Mongo Java Driver
Embedded REST
![Page 157: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/157.jpg)
Spring Data MongoDB
• Repository Support– Abfragen werden aus den Methodensignaturen erstellt– Annotationen für Abfragen
• Object-Document-Mapping– Annotationen: @Document, @Field, @Index, …– Klassen werden auf Collections gemappt, Javaobjekte auf
Dokumente
• Templating– Abstraktion der Ressourcen– Konfigurierbarkeit der Verbindungen zu MongoDB– Abdeckung des Lebenszyklus einer Collection– Unterstützung für Map/Reduce & Aggregation Framework
![Page 158: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/158.jpg)
Spring Data MongoDB:Konfiguration<!-- Connection to MongoDB server -->
<mongo:db-factory host="localhost" port="27017" dbname="test" />
<!-- MongoDB Template -->
<bean id="mongoTemplate,class="org.springframework.data.mongodb.core.MongoTemplate"><constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>
<!-- Package w/ automagic repositories -->
<mongo:repositories base-package="mongodb" />
![Page 159: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/159.jpg)
Spring Data MongoDB: Template<mongo:mongo host="${mongo.host}" port="${mongo.port}">
<mongo:optionsconnections-per-host="${mongo.connectionsPerHost}„threads-allowed-to-block-for-connectionmultiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}„connect-timeout="${mongo.connectTimeout}„max-wait-time="${mongo.maxWaitTime}„auto-connect-retry="${mongo.autoConnectRetry}„socket-keep-alive="${mongo.socketKeepAlive}„socket-timeout="${mongo.socketTimeout}„slave-ok="${mongo.slaveOk}„write-number="1„write-timeout="0„write-fsync="true"/>
</mongo:mongo><mongo:db-factory dbname= "test" mongo-ref="mongo"/>
![Page 160: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/160.jpg)
Spring Data MongoDB: Object Mappingpublic class Order {
@Id private String id;private Date date;@Field("custInfo") private String customerInfo;List<Item> items; ...
}
public class Item {private int quantity;private double price;@Field("desc") private String description;...
}
![Page 161: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/161.jpg)
Spring Data MongoDB: Repository Support
public interface OrderRepository extendsMongoRepository<Order, String> {
List<Order> findByItemsQuantity(intquantity);
List<Order> findByItemsPriceGreaterThan(doubleprice);
}
![Page 162: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/162.jpg)
Spring Data MongoDB: Zusätzliche Unterstützung für…
• Map/Reduce & das Aggregation Framework
• Das Management von Indexen
• Große Dateien mittels GridFS
• Geoinformatische Indexe und Abfragen
• Optimistisches Locking
![Page 163: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/163.jpg)
Hibernate OGM
![Page 164: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/164.jpg)
Kurzüberblick über Hibernate OGM MongoDB
Hersteller JBoss / RedhatLizenz GNU LGPL, Version 2.1Dokumentation http://www.hibernate.org/subproject
s/ogm.htmlHauptmerkmale • JPA API (Teilweise)
• JPQL Query Language
![Page 165: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/165.jpg)
Hibernate OGM
• Implementiert ein Subset der JPA API
• JP-QL Anfragen werden in native Datenbankabfragen übersetzt
• Unterstützt Infinispan, EhCache, MongoDB
![Page 166: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/166.jpg)
Architektur vonHibernate OGM
Source:
http://docs.jboss.org/hibernate/ogm/4.0/reference/en-US/html/ogm-architecture.html#d0e409
![Page 167: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/167.jpg)
Hibernate OGM MongoDB: Konfiguration
<persistence version="2.0" …><persistence-unit name="primary">
<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider><class>hibernate.Order</class><class>hibernate.Item</class><properties><property name="hibernate.ogm.datastore.provider"value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastorePr
ovider"/><property name="hibernate.ogm.mongodb.database" value=„odm"/><property name="hibernate.ogm.mongodb.host" value=„localhost"/><property name="hibernate.ogm.mongodb.port" value=„27017"/>
</properties></persistence-unit>
</persistence>
![Page 168: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/168.jpg)
@Entity@NamedQuery(
name="byItemsQuantity", query = "SELECT o FROM Order o JOIN o.items i WHERE i.quantity = :quantity")
public class Order {@GeneratedValue(generator = "uuid")@GenericGenerator(name = "uuid", strategy = "uuid2")@Id private String id;
private Date date;
@Column(name = "custInfo") private String customerInfo;
@ElementCollectionprivate List<Item> items;
@Embeddablepublic class Item {
private int quantity;
private double price;
@Column(name="desc") private String description; ...
Hibernate OGM MongoDB: Object Mapping
![Page 169: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/169.jpg)
Hibernate OGM MongoDB: Aktueller Status
• Frühes Beta-Stadium
• Aktuell nur Speichern / Mergen / Löschen von Daten möglich
• Noch keine Unterstützung für Abfragen
• Benutzt eine relationale API
![Page 170: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/170.jpg)
Not yet ready for prime time…
![Page 171: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/171.jpg)
Empfehlung
![Page 172: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/172.jpg)
Was sollte ich einsetzen?
Hibernate OGM
Spring Data MongoDB
MongoDB Java Driver
Morphia
JPA
JDBC
MongoDB
Jongo
- „Ready for production“- Von MongoDB Inc. unterstützt
- Ältestes Framework- Nicht so mächtig wie Spring
- „Ready for production“- Aktive Community
- Frühes Betastadium- Diskrepanz in API
Der „bessere“ Treiber
![Page 173: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/173.jpg)
Getting started…
One more thing…
![Page 174: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/174.jpg)
MongoDB User Group
https://www.xing.com/net/mongodb-ffm/
http://www.meetup.com/Frankfurt-Rhine-Main-MongoDB-User-Group/
![Page 175: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/175.jpg)
MongoDB Munich 2013
http://www.mongodb.com/events/mongodb-munich-2013/
![Page 176: MongoDB für Java-Programmierer](https://reader038.vdocuments.site/reader038/viewer/2022102814/54b75ae64a79594f0d8b4607/html5/thumbnails/176.jpg)
So Long, and Thanks for All the Fish!