176
MongoDB für Java-Programmierer

MongoDB für Java-Programmierer

Embed Size (px)

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 & Frameworks

Citation preview

Page 1: MongoDB für Java-Programmierer

Uwe Seileruweseiler

MongoDB für Java-Programmierer

Page 2: MongoDB für Java-Programmierer

About me

Big Data Nerd

TravelpiratePhotography Enthusiast

Hadoop Trainer MongoDB Author

Page 3: MongoDB für Java-Programmierer

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

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

Buzzword Bingo

Page 6: MongoDB für Java-Programmierer

NoSQL

Page 7: MongoDB für Java-Programmierer

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

Big Data

Page 9: MongoDB für Java-Programmierer

Meine Lieblingsdefinition

Page 10: MongoDB für Java-Programmierer

Die klassische Definition

• The 3 V’s of Big Data

•VarietyVolume Velocity

Page 11: MongoDB für Java-Programmierer

«Big Data» != Hadoop

Page 12: MongoDB für Java-Programmierer

Horizontale Skalierung

Page 13: MongoDB für Java-Programmierer

Vertikale Skalierung

RAMCPU

Storage

Page 14: MongoDB für Java-Programmierer

RAMCPU

Storage

Vertikale Skalierung

Page 15: MongoDB für Java-Programmierer

RAMCPU

Storage

Vertikale Skalierung

Page 16: MongoDB für Java-Programmierer

Horizontale Skalierung

RAMCPU

Storage

Page 17: MongoDB für Java-Programmierer

Horizontale Skalierung

RAMCPU

Storage

RAMCPU

Storage

RAMCPU

Storage

RAMCPU

Storage

RAMCPU

Storage

Page 18: MongoDB für Java-Programmierer

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

Das Problem mit der

Verteilung

Page 20: MongoDB für Java-Programmierer

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

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

Das Problem mit der

Konsistenz

Page 23: MongoDB für Java-Programmierer

ACID

vs.

BASE

Page 24: MongoDB für Java-Programmierer

ACID vs. BASE

Atomicity

Consistency

Isolation

Durability1983

RDBMS

Page 25: MongoDB für Java-Programmierer

ACID ist ein gutes Konzept, aber es ist

kein in Stein gemeißeltes Gesetz!

ACID vs. BASE

Page 26: MongoDB für Java-Programmierer

BasicallyAvailable

Soft State

Eventually consistent2008

NoSQL

ACID vs. BASE

Page 27: MongoDB für Java-Programmierer

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

Überblick über MongoDB

Page 29: MongoDB für Java-Programmierer

MongoDB ist eine …

• Dokumenten-basierte

• Open Source

• Performante

• Flexible

• Skalierbare

• Hochverfügbare

• Funktionsreiche…Datenbank

Page 30: MongoDB für Java-Programmierer

Dokumenten-basierte Datenbank

• Nicht im Sinne einer Datenbank für PDF-oder Worddokumente…

Page 31: MongoDB für Java-Programmierer

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

Daten-lokalität

Performance

In-Memory Caching

In-Place Updates

Page 33: MongoDB für Java-Programmierer

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

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

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

MongoDB Architektur

Page 37: MongoDB für Java-Programmierer

Reichhaltige Abfragen

Page 38: MongoDB für Java-Programmierer

Aggregation Framework

Page 39: MongoDB für Java-Programmierer

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

Geoinformationen

Page 41: MongoDB für Java-Programmierer

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

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

Datenmanipulation

Page 44: MongoDB für Java-Programmierer

RDBMS MongoDBTabelle / View ➜ CollectionZeile ➜ DokumentIndex ➜ IndexJoin ➜ Eingebettetes

DokumentFremdschlüssel ➜ Referenziertes

DokumentPartition ➜ Shard

Terminologie

Page 45: MongoDB für Java-Programmierer

Let’s have a look…

Page 46: MongoDB für Java-Programmierer

// 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

// 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

// 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

// 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

// 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

_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

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

// 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

// 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

// 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

// 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

// 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

// 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

// 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

// 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

// 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

// 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

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

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

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

Aggregation Pipeline

{document}

Pipeline Operator

Pipeline Operator

Pipeline Operator

Ergebnis{

sum: 337avg: 24,53min: 2max : 99

}

Page 67: MongoDB für Java-Programmierer

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

> db.tweets.aggregate(

{ $pipeline_operator_1 },

{ $pipeline_operator_2 },

{ $pipeline_operator_3 },

{ $pipeline_operator_4 },

...

);

Aufruf

Page 69: MongoDB für Java-Programmierer

// Alte Bekannte*

$match

$sort

$limit

$skip

Pipeline Operatoren

// Neue Freunde

$project

$group

$unwind

* Aus der Abfragefunktionalität

Page 70: MongoDB für Java-Programmierer

// 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

// 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

// 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

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

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

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

// 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

// 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

// Reduce Funktionreduce = function(key, values) {

return values.length;};

Word Count: Reduce Funktion

Page 79: MongoDB für Java-Programmierer

// 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

// 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

Indexing

Page 82: MongoDB für Java-Programmierer

Indexe in MongoDB sind B-Trees

Page 83: MongoDB für Java-Programmierer

Abfragen, Einfügen und Löschen: O(log(n))

Page 84: MongoDB für Java-Programmierer

Fehlende oder nicht optimale Indexe sind

das häufigste vermeidbare MongoDB Performance-Problem

Page 85: MongoDB für Java-Programmierer

// 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

// 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

// 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

// 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

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

// 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

// 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

// 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

// 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

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

Optimierung von Indexen

Page 96: MongoDB für Java-Programmierer

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

> 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

> 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

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

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

3. Anlegen der Indexe auf den abgefragten Feldern

Page 102: MongoDB für Java-Programmierer

// 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

// 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

// 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

// 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

Häufige Stolperfallen bei Indexen

Page 107: MongoDB für Java-Programmierer

// 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

// 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

// 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

> 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

// 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

Konsistenz beim Schreiben und Lesen von Daten

Page 113: MongoDB für Java-Programmierer

Starke Konsistenz

Page 114: MongoDB für Java-Programmierer

Verzögerte Konsistenz

Page 115: MongoDB für Java-Programmierer

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

Bestätigung durch das Netzwerk„Fire and forget“

Page 117: MongoDB für Java-Programmierer

Bestätigung durch MongoDB Wait for Error

Page 118: MongoDB für Java-Programmierer

Bestätigung durch das JournalWait for Journal Sync

Page 119: MongoDB für Java-Programmierer

Bestätigung durch SecondariesWait for Replication

Page 120: MongoDB für Java-Programmierer

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

{

_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

Bestätigung durch alle DatenzentrenWait for Replication (Tagging)

Page 123: MongoDB für Java-Programmierer

// 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

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

Nur Primaryprimary

Read

Page 126: MongoDB für Java-Programmierer

Primary bevorzugtprimaryPreferred

Read

Read

Page 127: MongoDB für Java-Programmierer

Nur Secondariessecondary

Read

Read

Page 128: MongoDB für Java-Programmierer

Secondaries bevorzugtsecondaryPreferred

Read

Read

Read

Page 129: MongoDB für Java-Programmierer

Nähester Knotennearest

Read

Read

Read

Page 130: MongoDB für Java-Programmierer

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

// 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

Java API & Frameworks

Page 133: MongoDB für Java-Programmierer

Übersicht

Hibernate OGM

Spring Data MongoDB

MongoDB Java Driver

Morphia

JPA

JDBC

MongoDB

Jongo

Page 134: MongoDB für Java-Programmierer

MongoDB Java Treiber

Page 135: MongoDB für Java-Programmierer

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

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

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

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

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

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

> db.order.find( {"items.quantity": ? } )

Beispiel: Bestellung

Page 142: MongoDB für Java-Programmierer

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

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

Jongo

Page 145: MongoDB für Java-Programmierer

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

Query in Java as in Mongo Shell

Page 147: MongoDB für Java-Programmierer

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

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

Morphia

Page 150: MongoDB für Java-Programmierer

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

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

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

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

Spring Data MongoDB

Page 155: MongoDB für Java-Programmierer

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

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

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

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

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

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

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

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

Hibernate OGM

Page 164: MongoDB für Java-Programmierer

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

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

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

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

@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

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

Not yet ready for prime time…

Page 171: MongoDB für Java-Programmierer

Empfehlung

Page 172: MongoDB für Java-Programmierer

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

Getting started…

One more thing…

Page 174: MongoDB für Java-Programmierer

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

MongoDB Munich 2013

http://www.mongodb.com/events/mongodb-munich-2013/

Page 176: MongoDB für Java-Programmierer

So Long, and Thanks for All the Fish!