BLOGS

MongoDB

MongoDB logo

Kas ir MongoDB

MongoDB ir atvērtā koda dokumentu orientēta datubāze. Atšķirībā no tradicionālajām relāciju datubāžu pārvaldības sistēmām (MySQL, PostgeSQL, Oracle u.c.), kurās nepieciešams definēt katra lauka tipu un rūpīgi pieturēties pie definētās shēmas, MongoDB ļauj ievietot datubāzē nestrukturizētus JSON objektus bez jebkādiem ierobežojumiem. Šādi aplikācijām tiek dota iespēja glabāt sarežģītus datus daudz saprotamākā veidā, paturot iespēju tos atlasīt pēc nepieciešamajiem kritērijiem. Ja tradicionālajās datubāzēs dati tiek glabāti tabulās, tad MongoDB dokumenti tiek glabāti kolekcijās. MongoDB lielākie trumpji ir ātrums, iebūvētā datu skaldīšana (sharding) un tas cik viegli ir palielināt datubāzes veiktspēju, pievienojot jaunus serverus.

Šādi izskatās tipisks MongoDB dokuments:

{
    "name": {
      "first": "Jānis",
      "last": "Bērziņš"
    },
    "sex": "male",
    "age": 30,
    "address": {
      "street": "Skolas iela 1",
      "city": "Rīga"
    },
    "skills": ["mongodb", "node.js", "javascript", "nginx"]
}

Piemēram, ja mēs gribētu atlasīt no kolekcijas users visus Jāņus, kas dzīvo Rīgā, tad mēs darītu šādi:

> db.users.find({"name.first": "Jānis", "address.city": "Rīga"})

Ir iespējams veikt arī sarežģītākus vaicājumus. Šādi izskatīsies vaicājums, kas atlasīs 10 lietotāju vārdus un uzvārdus, kas vecāki par 25 gadiem, prot JavaScript un node.js, sakārtoti augošā secībā pēc vecuma.

> db.users.find({"age": {"$gt": 25}, "skills": {"$all": ["javascript", "node.js"]}}, {"name": 1}).sort({"age": 1}).limit(10)

Ja nepieciešami vēl sarežģītāki vaicājumi, tad iespējams izpildīt JavaScript kodu datubāzē.

> db.users.find({"$where": function() { return this.age > 25}})

Lai nodrošinātu labu ātrdarbību ar lielām kolekcijām, nepieciešams izveidot indeksus uz biežāk izmantotajiem laukiem. Šādi izveidosim indeksu age laukam.

> db.users.ensureIndex({"age": 1})


Kā uzstādīt MongoDB

MongoDB ir pieejams arī pirmkoda veidā, bet šoreiz mēs uzstādīsim to no pakām uz Ubuntu, jo tas ir daudz ērtāk un ātrāk. Lai arī oficiālajās Ubuntu pakās ir pieejams MongoDB, tas ir vecs un nav ieteicams to izmantot, tāpēc mēs pievienosim MongoDB izstrādātāju piedāvāto repozitoriju.

Pievienojam MongoDB izstrādātāju GPG atslēgu:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

Pievienojam MongoDB izstrādātāju repozitoriju:

echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" >> /etc/apt/sources.list

Atjaunojam repozitoriju sarakstu:

sudo apt-get update

Un visbeidzot uzstādam MongoDB serveri:

sudo apt-get install mongodb-10gen


Kā izmantot MongoDB no PHP

Lai uzstādītu MongoDB PHP draiveri, pārliecinamies, ka ir uzstādīts PEAR:

sudo apt-get install php5-dev php5-cli php-pear

Uzstādam MongoDB PHP draiveri:

sudo pecl install mongo

Faila php.ini beigās pierakstam šādu rindiņu:

extension=mongo.so

Restartējam webserveri un mums ir lietošanai gatavs PHP, kas prot sarunāties ar MongoDB.

Šeit neliels PHP koda piemērs, kā izmantot MongoDB no PHP:

<?php

// Izveido konekciju uz MongoDB
$mongo = new Mongo();

// Datubāzes izvēle. Šajā gadījumā test
$db = $mongo->test;

// Izvēlamies kolekciju users
$users_col = $db->users;

// Pievienojam jaunu dokumentu
$doc = array(
    "name" => array("first" => "Jānis", "last" => "Bērziņš"),
    "sex" => "male",
    "age" => 25,
    "address" => array("street" => "Skolas iela 1", "city" => "Rīga"),
    "skills" => array("mongodb", "node.js", "javascript", "nginx")
);
$users_col->insert($doc);

// Pievienojam vēl vienu, bet ar mazliet savādāku struktūru
$doc = array(
    "name" => array("first" => "Juris", "last" => "Kļaviņš"),
    "sex" => "male",
    "age" => 32,
    "skills" => array("xhtml", "css"),
    "software" => array("photoshop", "illustrator"),
    "img" => "http://noderack.lv/img/logo.jpg"
);
$users_col->insert($doc);

// Atrodam visus vīriešus
$cursor = $users_col->find(array("sex" => "male"));

// Parādam atrasto lietotāju vārdus un uzvārdus
foreach ($cursor as $doc) {
    echo $doc["name"]["first"]." ".$doc["name"]["last"]."\n";
}

?>


Resursi internetā