home_site

Lab10 - Baza danych - MongoDB [ ver. TI.2025.12.3.002 ]

Zawartość strony

Plan zajęć

  1. Baza dokumentowa NoSQL - MongoDB
  2. Dostęp do bazy MongoDB w języku php

Baza dokumentowa MongoDB - wprowadzenie

  1. Ćwiczenie to wykonamy z wykorzystaniem poleceń powłoki shell do bazy danych MongoDB. Posłuży nam do tego program klienta mongo. W kolejnych punktach ćwiczenia utworzymy nową kolekcję dokumentów oraz zapoznamy się z poleceniami modyfikującymi zawartość kolekcji. W technologiach bazodanowych operacje te określamy jako operacje CRUD (create, read, update, delete). Na początek połączenie z bazą danych MongoDB i uwierzytelnienie.
    1. Uwierzytelnienie w ramach polecenie systemu Linux
      $ mongosh -u user 172.20.44.30/dbase -p 
      
    2. Uwierzytelnienie w ramach program klienta bazy - mongo
      $ mongosh 172.20.44.30/dbase
      > db.auth("user","pass")
      
    W ramach poleceń należy wprowadzić odpowiednio: user - użytkownik bazy danych, pass - hasło do uwierzytelnienia w bazie danych oraz dbase - nazwa bazy danych. Z programu mongo wychodzimy z wykorzystaniem poleceń exit lub quit().
  2. Tworzymy kolekcję w naszej bazie danych z wykorzystaniem polecenia db.createCollection.
    db.createCollection("student")
    show collections
    
  3. Wprowadzamy nowe dokumenty do utworzonej kolekcji (operacja CREATE).
    u1={fname:"Adam", lname:"Abacki", faculty:"WFiIS", year:1 }
    u2={fname:"Bogdan", lname:"Babacki", faculty:"WFiIS", year:1 }
    u3={fname:"Robert", lname:"Cabacki", faculty:"WFiIS", year:1 }
    u4={fname:"Marek", lname:"Dabacki", faculty:"WFiIS", year:1 }
    db.student.insertOne(u1)
    db.student.insertOne(u2)
    db.student.insertOne(u3)
    db.student.insertOne(u4)
    
  4. Wprowadzamy nowe dokumenty do utworzonej kolekcji z wykorzystaniem danych w tablicy.
    var stud = [ 
    {fname:"Adam", lname:"Abacki", faculty:"WFiIS", year:1 },
    {fname:"Bogdan", lname:"Babacki", faculty:"WFiIS", year:1 },
    {fname:"Robert", lname:"Cabacki", faculty:"WFiIS", year:1 },
    {fname:"Marek", lname:"Dabacki", faculty:"WFiIS", year:1 } ] ;
    db.student.insertOne(stud)
    
  5. Przeglądanie i wyszukiwanie danych w kolekcji (operacja READ).
    db.student.find()
    db.student.find({lname:"Abacki"})
    db.student.find({},{lname:1})
    db.student.find({$or:[{lname:"Abacki"},{lname:"Babacki"}]})
    db.student.find({},{fname:1}).sort({fname:1})
    db.student2023.find({},{fname:1}).sort({fname:1}).toArray()[3].fname
    db.student.find().limit(2)
    db.student.find().limit(2).skip(2)
    
  6. Poprawa danych w ramach kolekcji (operacja UPDATE).
    db.student.updateMany({},{$set:{academy:"AGH"}},{multi:true})
    
  7. Usuwanie dokumentów z kolekcji (operacja DELETE).
    db.student.deleteOne({fname:"Adam"})
    db.student.deleteMany({})
    
  8. Na koniec usuwamy utworzoną kolekcję "student".
    db.student.drop()
    
  9. Skrypty w bazie danych MongoDB
    db.createCollection("student")
    u1={fname:"Adam", lname:"Abacki", faculty:"WFiIS", year:1 }
    u2={fname:"Bogdan", lname:"Babacki", faculty:"WFiIS", year:1 }
    u3={fname:"Robert", lname:"Cabacki", faculty:"WFiIS", year:1 }
    u4={fname:"Marek", lname:"Dabacki", faculty:"WFiIS", year:1 }
    db.student.insertOne(u1)
    db.student.insertOne(u2)
    db.student.insertOne(u3)
    db.student.insertOne(u4)
    func1 = function () { for ( var i=0; i<4; i++ ) { 
             print(db.student.find({},{fname:1}).toArray()[i].fname) ; } }
    func1()
    func2 = function () {
         for ( var i=0; i<100; i++) {
             db.student.insertOne({x:i})
         }
        var cursor = db.student.find({},{x:1}).sort({x:1}) ;
        while (cursor.hasNext()) {
             obj = cursor.next();
             print(obj.x);
    } }
    func2()
    
  10. Technologia MapReduce w bazie MongoDB (przykład).
    db.createCollection("test")
    func3 = function () {  
          for ( var i=0; i<100; i++) { 
                 db.test.insertOne( { "i" : i, "username" : "user"+i,
                   "age" : Math.floor(Math.random()*120), "create" : new Date() } ) ; 
     } }
    func3()
    db.test.find({})
    var map = function() { emit ('all', this.i); }
    var reduce = function(key,value) { return Array.sum(value); }
    db.test.mapReduce( map, reduce, { query:{i:{$lt:10}},  out:"result"} )
    db.result.find({})
    
    Obecna wersja bazy MongoDB zaleca używanie zamiast Map-Reduce - Aggregation Pipeline. Map-Reduce to Aggregation Pipeline.

Baza danych MongoDB - klient php

W ramach zadania zostanie zrealizowany dostęp do bazy danych MongoDB z skryptu php. Poniżej znajdują się pliki umożliwiające zrealizowanie zadania.

  1. Przygotowanie środowiska do uruchomienia serwisu wymaga dodania do naszego katalogu biblioteki obsługującej bazę danych MongoDB. Zrealizujemy to poprzez wgranie biblioteki mongodb w katalogu "vendor". Archiwum katalogu znajduje się w pliku "vendor.tar.gz". Dodatkowo należy umieścić plik zawierający informację o dołączonej bibliotece - "composer.json".
    {
        "require": {
            "mongodb/mongodb": "^1.4"
        }
    }
    
  2. Plik mongo.php - realizacja operacji CRUD w bazie danych MongoDB z wykorzystaniem języka php.

    Plik mongo.php - ( [listing dokumentu] [link do dokumentu] )

       <?php
    
    //require 'vendor/autoload.php' ;
    
    class db {
        private $user = "user" ;
        private $pass = "pass";
        private $host = "172.20.44.30";
        private $base = "dbase" ;
        private $coll = "student";
        private $conn;
        private $dbase;
        private $collection;
    
    
        function __construct() {
          $this->conn = new MongoDB\Client("mongodb://{$this->user}:{$this->pass}@{$this->host}/{$this->base}"); 
          //$this->conn = new MongoDB\Client($this->url_atlas);   
          //print_r( $this->conn ) ;
          
          //$command = new MongoDB\Driver\Command(array("ping" => 1));
          //$result = $this->conn->executeCommand("test", $command);
          //var_dump($result, $result->toArray());
          
          //$this->dbase = $this->conn->selectDB($this->base);
          //$this->collection = $this->dbase->selectCollection($this->coll);
          $this->collection = $this->conn->{$this->base}->{$this->coll};
          //print_r ( $this->collection ) ;
        }
    
        function select() {
          $cursor = $this->collection->find();
          $table = iterator_to_array($cursor);
          return $table ;
        }
    
        function insert($user) {
          $ret = $this->collection->insertOne($user) ;
          return $ret;
        }
    
        function update($ident,$user,$flag) {
          if ( $flag ) {
             $rec = new MongoDB\BSON\ObjectId($ident);
             $filter = array ( '_id' => $rec );
          } else {
             $filter = array ( 'ident' => $ident );
          }
          $update = array ( '$set' => $user );
          //$option = array ( 'w' => 1 );
          //$ret = $this->collection->update($filter,$update,$option);
          $updresult = $this->collection->updateOne($filter,$update);
          //return $ret['nModified'];
          $ret = $updresult->getModifiedCount();
          return $ret;
        }
    
        function delete($ident,$flag) {
          if ( $flag ) {
             $rec = new MongoDB\BSON\ObjectId($ident);
             $filter = array ( '_id' => $rec );
          } else {
             $filter = array ( 'ident' => $ident );
          }
          //$option = array( 'justOne' => true, 'w' => 1 );
          //$ret = $this->collection->remove($filter,$option);
          $delresult = $this->collection->deleteOne($filter);
          $ret = $delresult->getDeletedCount(); 
          //return $ret['n'];
          return $ret;
        }
    }
      
  3. Plik test_mongo.php - testowanie funkcjonalności opracowanego interfejsu dostępu do bazy danych.

    Plik test_mongo.php - ( [listing dokumentu] [link do dokumentu] )

    <?php
    
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    
    require 'vendor/autoload.php' ;
    include 'mongo/mongo.php';
    $db = new db();
    
    print "<pre>" ;
    
    print "Polaczono z baza danych" ;
    
    // Test insert()
    print "Test insert() function <br/>" ;
    $record = array ( 'ident' => 1, 'fname' => 'mirek', 'lname' => 'kowalski', 'faculty' => 'wfiis', 'year' => '2015' ) ;
    $flag = $db->insert($record);
    //print "[ ".$flag." ]";
    print $flag?"OK":"not OK";
    print "<br/>";
    $record = array ( 'ident' => 2, 'fname' => 'adam', 'lname' => 'abacki', 'faculty' => 'wfiis', 'year' => '2015' ) ;
    $flag = $db->insert($record);
    //print "[ ".$flag." ]";
    print $flag?"OK":"not OK";
    print "<br/>";
    
    print "\n<br/>------------ <br/>\n" ;
    
    
    // Test select()
    print "Test select() function <br/>\n" ;
    $data = $db->select();
    print_r($data) ;
    print "\n<br/>------------ <br/>\n" ;
    
    // Test delete()
    print "Test delete() function <br/>\n" ;
    $id =  1  ;
    $flag = $db->delete($id,0) ;
    print "[ ".$flag." ]";
    
    print "\n<br/>----------- <br/>\n" ;
    
    // Test update() 
    print "Test update() function <br/>\n";
    $id =  2  ;
    $data = array ( 'year' => '2016' ) ;
    $flag = $db->update($id,$data,0) ;
    print "[ ".$flag." ]";
    
    print "\n<br/>----------- <br/>\n" ;
    print "</pre>" ;
    
    ?>
      

Linki do uruchomionych przykładów na serwerze Pascal

Linki dostępne z sieci wydziałowej.