Please disable Adblockers and enable JavaScript for domain CEWebS.cs.univie.ac.at! We have NO ADS, but they may interfere with some of our course material.
Tutorial für MongoDB
Stand: 01.03.2016
Ziel: Beschreibung einer initialen Arbeitsumgebung für das Projekt
Nicht-Ziel: Beschreibung von MongoDB, Maven, Erstellung einer vollständigen Web-App, Beschreibung einer Web-App Arichtektur, etc. (hierfür gibt es zahlreiche externe Tutorials)
Dieses Tutorial ist eine Hilfestellung. Debuggen etc. ist Ihre Aufgabe.
Voraussetzungen: Lauffähige JAVA-Version (JDK 1.8), Eclipse
Aufbau:
Installation von MongoDB
Dieser Abschnitt berschreibt, wie MongoDB in einer "Standard-Umgebung" installiert werden kann. Eine detailierte Beschreibung findet man unter «https://docs.mongodb.org/getting-started/java/».
- Download von «https://www.mongodb.org/downloads#production». Für Windows 7 x64 ist die Distribution "Windows 64-bit 2008 R2+" zu wählen.
- *.msi ausführen. In diesem Tutorial wurde MongoDB unter C:/mongodb installiert.
- Erstellen Sie im Installtionsordner (in diesem Fall C:/mongodb) einen Ordner "data"
- MongoDB starten: Im Installationsverzeichnis befindet sich der Ordner "bin". In diesem wiederum befindet sich die Datei mongod.exe (Achtung mongod vs mongo). Führen Sie diese exe-Datei in einer cmd aus:
mongod.exe --dbpath c:\mongodb\data
Lassen Sie die Konsole offen! Sie finden in der Konsole auch den verwendenten Port.
- Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie, ob Sie für Ihr Betriebssystem die richtige Version installiert haben!
- Die verwendeten Testdaten finden Sie unter «https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json». Laden Sie diese herunter und nennen Sie diese "primer-dataset.json". Kopieren Sie die Datei in den bin Ordner (oder passen Sie den Pfad im folgenden Punkt an).
- Starten Sie die Exe "mongoimport" in einer neuen Konsole mit den folgenden Parameter:
mongoimport --db test --collection restaurants --drop --file primer-dataset.json
- Für das Testen wird eine neue Konsole benötigt. In dieser wird die exe-Datei Mongo ausgeführt.
mongo
Sie sollten automatisch mit "test" verbunden sein. Sie können in der Konsole Ihre Queries ausführen wie z.B.:
db.restaurants.find()
Die Installation wurde auch erfolgreich für ein Ubuntu-System durchgeführt. Es sollte daher kein Problem darstellen, mit Ubuntu oder ähnlichem zu arbeiten.
Verbinden mit Java
In diesem Abschnitt wurde Apache Maven für das Auflösen der Libraries verwendet.
Die Verwendung von Maven ist nicht nicht notwendig bzw. nicht verpflichtend. Sollten Sie Probleme mit dem Umgang mit Maven haben, empfehle ich Ihnen, die für die Verbindung zu MongoDB notwendigen JaARs zu suchen und in den Build-Path zu inkludieren! Sie können die JARs unter http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.2.2 herunterladen.
Mehr Informationen für das Arbeiten ohne Maven sind hier.
Dieser Abschnitt setzt voraus, dass Sie Maven als auch das Maven-Plugin M2Eclipse für Eclipse installiert haben. In diesem Tutorial wurde mit Maven 3.3.3 sowie mit eclipse Mars gearbeitet.
Hilfe bei der Maven Installation finden Sie unter «https://maven.apache.org/install.html».
In diesem Abschnitt wird eine Mini-Webapp erstellt. Mit dieser kann man nach Restaurants in einem District mit der Hilfe der PLZ suchen. Das Ergebnis sieht wie folgt aus:
Insgesamt müssen 3 Datein erzeugt werden: eine JSP, ein Servlet und eine herklömmliche Java Klasse. Dies wird in den folgeden Punkten beschrieben.
- Erzeugen Sie ein neues Maven Projekt
- Klicken Sie bei "Select project name and location" einfach auf "Next"
- Wählen Sie den Archetype "WebApp" aus
- Geben Sie eine GruppenId, etc. ein
- Öffnen Sie die POM Datei
Tragen Sie in der POM-Datei die folgenden Dependencies ein:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Maven löst die Dependencies automatisch auf→ Sie brauchen sich nicht mehr um JARs zu kümmern.
Da in diesem Abschnitt mit dem Webserver Jetty gearbeitet wird, muss auch noch folgendes Plugin eingetragen werden:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
</plugin>
Eine fertige POM-Datei finden Sie hier.
Löschen Sie ggf die jsp Datei, welche einen Debug-Fehler aufweist.
- Erstellen Sie einen neuen Source-Folder in dem Sie mit der rechten Maustaste auf "Java-Resources" klicken.
Nennen Sie den Folder "java" und wählen Sie Ihr vorhin erstelltes Projekt.
- Die Projektstruktur sollte nun wie folgt aussehen:
- Um das Projekt zu builden öffnen Sie eine neue Konosle und wechseln Sie in den Ordner, wo Ihre pom.xml Datei liegt. Dort können Sie mit dem Befehl mvn Ihr Build-Goal angeben wie z.B. clean
mvn clean
Es ist auch möglich, dies dirket im Eclipse zu machen. Hierfür müssen Sie Ihr Projekt auswählen und bei "Run as" Ihre gewünschte Aktion auswählen.
- Erstellen Sie nun eine herkömmliche Klasse und ein Servlet indem Sie mit rechter Maustaste>New>Servlet auswählen. Die einfache Klasse fungiert als Bean.
Die Struktur sieht nun wie folgt aus:
- Die Klasse "SimpleModel" ist meine Bean. Diese hat die Aufgabe, sich mit der MongoDB zu verbinden.
Um sich mit der MongoDB Instanz zu verbinden benötigt man folgendes Statement (Achtung: die Konsole, in welcher MongoDB gestartet wurde, darf nicht geschlossen werden! )
MongoClient mongoClient = new MongoClient();
Ohne zusätliche Angaben wird localhost und der Port 27017 verwendet.
Um eine Datenbank zu wählen, benötigt man die getDatabase-Methode. Da in einem vorherigen Schritt die Testdaten in die Test-Datenbank geladen wurden, wird diese ausgewählt:
MongoDatabase db = mongoClient.getDatabase("test");
Queries kann man mit Hilfe der Find-Mehtode absetzten. Mehr zu Queries
Im folgenden Code wird nach allen Restaurants gesucht, deren zipcode im "Objekt" Adresse 112233 entspricht. Für die gefunden Restaurants wird auf den Namen zugegriffen.
FindIterable<Document> documents =
db.getCollection("restaurants")
.find(new Document ("address.zipcode","112233"));
MongoCursor<Document> cursor = documents.iterator();
while(cursor.hasNext()){
Document d=cursor.next();
d.getString("name")
}
cursor.close();
Die Find Methode liefert eine Collection des Typs "Document". Selbstverständlich kann, anstelle des Cursor-Konstruktes, über eine herkömmliche for-each Konstruktion auf die gefunden Elemente zugegriffen werden. Dies wird sogar auf dem offiziellen Tutorial vorgestellt. Dabei schließt der Cursor automatisch abhängig von Version bzw. eingestellten Cursor-Type.
Mit den get-Methoden können die Eigenschaften der Dokumente abgefragt werden. Im obigen Fall wird der Wert des Attributs "name" abgefragt. Die Beispieldatei finden Sie hier.
Informationen über Insert, Update, Delete finden Sie unter «https://docs.mongodb.org/getting-started/shell/».
- Als nächstes wird die Servlet-Datei erstellt. Diese finden Sie hier. Die Aufgabe des Servlets ist es, auf die JSP-Datei zu verweisen. Dabei wird aber zunächst noch die Bean mitgegeben.
request.setAttribute("result",(new SimpleModel()).find(request.getParameter("searchTerm")));
//forward to jsp
RequestDispatcher view =
request.getRequestDispatcher("Init.jsp");
view.forward(request, response);
- Die JSP-Datei beinhaltet das HTML-Formular und zeigt die Ergebnisse an. In diesem Tutorial wurde die Expression-Language verwendet. Die Datei finden Sie hier.
<form action="search.do" method="POST">
<input id="searchTerm" name="searchTerm"/>
<input type="SUBMIT"/>
</form>
<c:forEach var="item" items="${result}">
${item}<br>
</c:forEach>
- Um die Applikation zu starten können Sie z.B. den jetty server von Maven verwenden. Öffen Sie dazu eine Konsole und wechseln Sie in den Pfad, wo Ihre pom.xml liegt. Dort können Sie den jetty server mit folgendem Kommando starten:
mvn jetty:run
- Ihre Applikation ist nun lauffähig! Der jetty server läuft üblicherweise auf dem Port 8080. D.h. Sie benötigen folgende URL um auf die Applikation zuzugreifen: http://localhost:8080/search.do
Verbinden mit PHP
Voraussetzungen: installierter PHP-Server
Das vollständige Tutorial finden sie «hier»
Achtung: es gibt 2 Komponenten in PHP mongo (veraltet) und mongodb
- MongoDB Package downloaden von http://pecl.php.net/package/mongodb (ACHTUNG: Es ist wichtig, dass Sie die richtige Version nehmen!) Im Falle von Windows benötigen Sie die dll.
- Die DLL auf php_mongo unbenennen und in den Ordner php\ext legen.
- In der php.ini Datei folgende Zeile einfügen
extension=php_mongo.dll
- Apache muss neu gestartet werden
- PHP Composer downloaden und installieren. PHP Composer finden Sie «hier».
- Konsole öffnen und in den Projektorder wechseln (wo Sie in Zukunft Ihre PHP-Datei speichern). Dort müsen Sie folgenden Befehl ausführen umd Libraries herunterzuladen
composer require "monogdb/mongodb=^1.0.0
Es sollte ein Ordner "vendor" erzeugt werden. Gegebenfalls müssen Sie Ihren PC neu starten (falls der composer Befehl nicht gefunden wird).
Nun können Sie MongoDB verwenden wie es z.B. in «http://php.net/manual/de/mongodb.tutorial.library.php» beschrieben wird. Das folgende Beispiel basiert auf diesem Tutorial.
Umbedingt brauchen Sie die vom Composer erzeugten Artefakte um die Library ManogDB verwenden zu können:
require 'vendor/autoload.php';
Mit der Monog DB können sie sich folgendermaßen verbinden:
$client = new MongoDB\Client("mongodb://localhost:27017");
In diesem Tutorial wird die Datenbank "test" benutzt und auf die Collection restaurants zugegriffen.
$collection = $client->test->restaurants;
Für Suchabfragen kann die Find-Methode verwendet werden. Im folgenden Beispiel wird nach Restaurants gesucht, welche sich in District mit dem PLZ 11225 befinden.
$result = $collection->find( [ 'address.zipcode' => '11225'] );
Auf die Ergebnisse können sie mit einer for-each Schleife zugreifen. Im folgendne Beispiel wird der Name des Restaurants ausgegeben.
foreach ($result as $entry) {
echo $entry['name'], "<br />";
}
Die vollständige Datei finden Sie hier.
Das Resultat sieht wie folgt aus:
Informationen über Create, Read und Update finden Sie «hier».
Hands-On
// Select database to use
use imse_tutorial_db;
// Create collection
db.createCollection("posts");
// Insert a singe document
db.posts.insert({
title: 'IMSE NoSQL Tutorial',
description: 'Basic concepts and some hands-on experience.',
by: 'Ralph Vigne',
url: 'https://cewebs.cs.univie.ac.at/imse/ws17/index.php',
tags: ['mongodb', 'IMSE', 'NoSQL'],
likes: 1
});
// Batch insert of 3 more posts
db.posts.insertMany([
{
title: 'Digital Economy Tutorial',
description: 'Basic design concepts of B2B systems.',
by: 'Ralph Vigne',
url: 'https://cewebs.cs.univie.ac.at/imse/ws17/index.php',
tags: ['DigiOek', 'REST', 'SOA'],
likes: 5
}, {
title: 'Large Scale Database Systems',
description: 'Overview about different largescale databse systems and key concepts.',
by: 'Erich Schikuta',
url: 'https://cewebs.cs.univie.ac.at/imse/ws17/index.php',
tags: ['DBS', 'SQL'],
likes: 20
}, {
title: 'SQL Databases Tutorial',
description: 'Basic concepts and some hands-on experience.',
by: 'Alex Adamenko',
url: 'https://cewebs.cs.univie.ac.at/imse/ws17/index.php',
tags: ['mariadb', 'DBS', 'SQL'],
likes: 10
}
]);
// Find first entry in collection
db.posts.findOne();
// Find all entries in collection
db.posts.find().pretty();
// Find all entries with more than 10 likes
db.posts.find({likes: { $gt: 10}}).pretty();
// Find all entries written by Ralph Vigne and have at least 5 likes
db.posts.find({by: 'Ralph Vigne', 'likes': {$gte: 5}}).pretty()
// Find all entries tagged with DBS
db.posts.find({tags: 'DBS'}).pretty()
// Find all entries authored by Alex or Erich
db.posts.find({$or: [{by: 'Ralph Vigne'}, {by: 'Erich Schikuta'}]}).pretty()
// Udate IMSE post with one more like
db.posts.update({title: 'IMSE NoSQL Tutorial'}, {$inc: {likes: 1}})
// Set IMSE post to 20 ikes
db.posts.update({title: 'IMSE NoSQL Tutorial'},{$set: {likes:20}})
// Select only the title field from each post - also exclude the _id filed
db.posts.find({},{title:1, _id: 0}).pretty()
// Select only the first 2 posts
db.posts.find({},{title:1, _id: 0}).pretty().limit(2)
// Select only the second two posts
db.posts.find({},{title:1, _id: 0}).pretty().limit(2).skip(2)
// Excursus: matching on sub documents
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
// Select matching sub document
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
// won't match
db.inventory.find( { size: { w: 21, h: 14, uom: "cm" } }
// Select all document with matching sub document attribute
db.inventory.find( { "size.uom": "in" } )
// Sort posts by likes
db.posts.find({},{title:1, _id: 0, likes: 1}).sort({likes:1}
// Sort posts by likes, and sort invers by title as second attribute
db.posts.find({},{title:1, _id: 0, likes: 1}).sort({likes:1, title:-1})
// Count entries per author
db.posts.aggregate([{$group: {_id: "$by", num_posts: {$sum : 1}}}])
// Count entries per user with more than 10 likes
db.posts.aggregate([ {$match: {likes: {$gte: 10}}}, {$group: {_id: "$by", num_posts: {$sum : 1}}} ])
Letzte Änderung: 16.01.2018, 14:57 | 2112 Worte