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 (up)

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 (up)

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/». 
 
mongod.exe --dbpath c:\mongodb\data
Lassen Sie die Konsole offen! Sie finden in der Konsole auch den verwendenten Port. 
MongoDB starten
Abbildung 1: MongoDB starten
mongoimport --db test --collection restaurants --drop --file primer-dataset.json
mongo
Sie sollten automatisch mit "test" verbunden sein. Sie können in der Konsole Ihre Queries ausführen wie z.B.: 
db.restaurants.find()
Verbinden zur MongoDB
Abbildung 2: Verbinden zur MongoDB
 
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 (up)

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: 
WebApp mit MonogDB
Abbildung 3: WebApp mit MonogDB
 
Insgesamt müssen 3 Datein erzeugt werden: eine JSP, ein Servlet und eine herklömmliche Java Klasse. Dies wird in den folgeden Punkten beschrieben. 
 
Maven Project
Abbildung 4: Maven Project
 
Wählen Sie den Archetype "WebApp" aus
Abbildung 5: Wählen Sie den Archetype "WebApp" aus
 
Archetype Parameters
Abbildung 6: Archetype Parameters
 
POM-Datei öffnen
Abbildung 7: POM-Datei öffnen
 
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
 
Eintragen einer zusätzlichen Dependency
Abbildung 8: Eintragen einer zusätzlichen Dependency
 
Löschen Sie ggf die jsp Datei, welche einen Debug-Fehler aufweist. 
 
Source Folder erstellen
Abbildung 9: Source Folder erstellen
 
Nennen Sie den Folder "java" und wählen Sie Ihr vorhin erstelltes Projekt. 
 
Name des Source Folders
Abbildung 10: Name des Source Folders
 
Projektstruktur
Abbildung 11: Projektstruktur
 
mvn clean
 
MVN Clean
Abbildung 12: 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.  
 
MVN Build in Eclipse
Abbildung 13: MVN Build in Eclipse
 
Servlet erstellen
Abbildung 14: Servlet erstellen
 
Die Struktur sieht nun wie folgt aus: 
 
 
Ordner-Struktur
Abbildung 15: Ordner-Struktur
 
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/». 
 
    request.setAttribute("result",(new SimpleModel()).find(request.getParameter("searchTerm")));
    
    //forward to jsp
    RequestDispatcher view =
        request.getRequestDispatcher("Init.jsp");
        view.forward(request, response);
 
  <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>
 
mvn jetty:run
 
jetty server starten
Abbildung 16: jetty server starten
 
Finales Ergebnis
Abbildung 17: Finales Ergebnis

Verbinden mit PHP (up)

Voraussetzungen: installierter PHP-Server 
 
Das vollständige Tutorial finden sie «hier» 
 
Achtung: es gibt 2 Komponenten in PHP mongo (veraltet) und mongodb  
 
extension=php_mongo.dll
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). 
 
Ausführen des Composers
Abbildung 18: Ausführen des Composers
 
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: 
 
Ausgabe
Abbildung 19: Ausgabe
 
Informationen über Create, Read und Update finden Sie «hier». 

Hands-On (up)

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