MongoDB für Java Programmierer (JUGKA, 11.12.13)
-
Upload
uwe-seiler -
Category
Technology
-
view
3.977 -
download
5
description
Transcript of MongoDB für Java Programmierer (JUGKA, 11.12.13)
![Page 1: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/1.jpg)
Uwe Seileruweseiler
MongoDB für Java-Programmierer
![Page 2: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/2.jpg)
About me
Big Data Nerd
TravelpiratePhotography Enthusiast
Hadoop Trainer MongoDB Author
![Page 3: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/5.jpg)
Buzzword Bingo
![Page 6: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/6.jpg)
NoSQL
![Page 7: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/8.jpg)
Big Data
![Page 9: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/9.jpg)
Meine Lieblingsdefinition
![Page 10: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/10.jpg)
Die klassische Definition
• The 3 V’s of Big Data
•VarietyVolume Velocity
![Page 11: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/11.jpg)
«Big Data» != Hadoop
![Page 12: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/12.jpg)
Horizontale Skalierung
![Page 13: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/13.jpg)
Vertikale Skalierung
RAMCPU
Storage
![Page 14: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/14.jpg)
RAMCPU
Storage
Vertikale Skalierung
![Page 15: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/15.jpg)
RAMCPU
Storage
Vertikale Skalierung
![Page 16: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/16.jpg)
Horizontale Skalierung
RAMCPU
Storage
![Page 17: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/17.jpg)
Horizontale Skalierung
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
RAMCPU
Storage
![Page 18: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/19.jpg)
Das Problem mit der
Verteilung
![Page 20: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/22.jpg)
Das Problem mit der
Konsistenz
![Page 23: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/23.jpg)
ACID
vs.
BASE
![Page 24: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/24.jpg)
ACID vs. BASE
Atomicity
Consistency
Isolation
Durability1983
RDBMS
![Page 25: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/26.jpg)
BasicallyAvailable
Soft State
Eventually consistent2008
NoSQL
ACID vs. BASE
![Page 27: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/28.jpg)
Überblick über MongoDB
![Page 29: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/30.jpg)
Dokumenten-basierte Datenbank
• Nicht im Sinne einer Datenbank für PDF-oder Worddokumente…
![Page 31: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/32.jpg)
Daten-lokalität
Performance
In-Memory Caching
In-Place Updates
![Page 33: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/36.jpg)
MongoDB Architektur
![Page 37: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/37.jpg)
Reichhaltige Abfragen
![Page 38: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/38.jpg)
Aggregation Framework
![Page 39: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/40.jpg)
Geoinformationen
![Page 41: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/43.jpg)
Datenmanipulation
![Page 44: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/44.jpg)
RDBMS MongoDBTabelle / View ➜ CollectionZeile ➜ DokumentIndex ➜ IndexJoin ➜ Eingebettetes
DokumentFremdschlüssel ➜ Referenziertes
DokumentPartition ➜ Shard
Terminologie
![Page 45: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/45.jpg)
Let’s have a look…
![Page 46: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/78.jpg)
// Reduce Funktionreduce = function(key, values) {
return values.length;};
Word Count: Reduce Funktion
![Page 79: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/81.jpg)
Indexing
![Page 82: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/82.jpg)
Indexe in MongoDB sind B-Trees
![Page 83: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/83.jpg)
Abfragen, Einfügen und Löschen: O(log(n))
![Page 84: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/84.jpg)
Fehlende oder nicht optimale Indexe sind
das häufigste vermeidbare MongoDB Performance-Problem
![Page 85: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/95.jpg)
Optimierung von Indexen
![Page 96: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/101.jpg)
3. Anlegen der Indexe auf den abgefragten Feldern
![Page 102: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/106.jpg)
Häufige Stolperfallen bei Indexen
![Page 107: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/112.jpg)
Konsistenz beim Schreiben und Lesen von Daten
![Page 113: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/113.jpg)
Starke Konsistenz
![Page 114: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/114.jpg)
Verzögerte Konsistenz
![Page 115: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/116.jpg)
Bestätigung durch das Netzwerk„Fire and forget“
![Page 117: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/117.jpg)
Bestätigung durch MongoDB Wait for Error
![Page 118: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/118.jpg)
Bestätigung durch das JournalWait for Journal Sync
![Page 119: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/119.jpg)
Bestätigung durch SecondariesWait for Replication
![Page 120: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/122.jpg)
Bestätigung durch alle DatenzentrenWait for Replication (Tagging)
![Page 123: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/125.jpg)
Nur Primaryprimary
Read
![Page 126: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/126.jpg)
Primary bevorzugtprimaryPreferred
Read
Read
![Page 127: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/127.jpg)
Nur Secondariessecondary
Read
Read
![Page 128: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/128.jpg)
Secondaries bevorzugtsecondaryPreferred
Read
Read
Read
![Page 129: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/129.jpg)
Nähester Knotennearest
Read
Read
Read
![Page 130: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/132.jpg)
Java API & Frameworks
![Page 133: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/134.jpg)
MongoDB Java Treiber
![Page 135: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/141.jpg)
> db.order.find( {"items.quantity": ? } )
Beispiel: Bestellung
![Page 142: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/144.jpg)
Jongo
![Page 145: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/146.jpg)
Query in Java as in Mongo Shell
![Page 147: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/149.jpg)
Morphia
![Page 150: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/154.jpg)
Spring Data MongoDB
![Page 155: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/162.jpg)
Spring Data MongoDB: Zusätzliche Unterstützung für…
• Map/Reduce & das Aggregation Framework
• Das Management von Indexen
• Grosse Dateien mittels GridFS
• Geoinformatische Indexe und Abfragen
• Optimistisches Locking
![Page 163: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/163.jpg)
Hibernate OGM
![Page 164: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/170.jpg)
Not yet ready for prime time…
![Page 171: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/171.jpg)
Empfehlung
![Page 172: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/173.jpg)
Getting started…
One more thing…
![Page 174: MongoDB für Java Programmierer (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/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 (JUGKA, 11.12.13)](https://reader033.fdocuments.in/reader033/viewer/2022061218/54b75ae04a795905078b4668/html5/thumbnails/175.jpg)
So Long, and Thanks for All the Fish!