03 Mar

Anulu élete Pongo-MongoDB szigetén


Aki látta már a Kincs, ami nincs című szuperprodukciót találkozott már a MongoDB szócskával, demindeddig halvány gőze se volt arról, hogy ez pontosan mi is és mire való, azt leszámítva, hogy benne van a sokat sejtető DB szócska (lsd: darab)... na pont nekik szól ez a cikk! Megnézzük hogy is kell telepíteni, hogy kell használni PHP oldalon, miként tárolja az adatokat és még sok mást! Aki pedig nem érti és elakadna, az ne feledje: "Csak a puffin ad nekem erőt és mindent lebíró akaratot!"127020_galeria_kincs_ami_nincs_02

Mielőtt a lényegre térnénk, nézzük hol és mikor van jelentősége a MongoDB-nek, cikkünk fő témájának. A megoldások válaszok egy problémára, generáljunk hát egy problémát!

Tegyük fel, hogy oldalunk SQL alapú adatbázist használ és a sors oda vet minket, hogy az adatbázisban hierarchikus adatokat kellene tároljunk. Tároljunk mondjuk egy űrlapot, aminek különböző elemei lehetnek. Csináljunk például egy Form osztályt, aminek lesz például egy $fields példányváltozója, amiben az űrlaphoz tartozó mezők szerepelnek. Ezekhez a mezőkhöz hozzá lehet rendelni validátorokat, ami validátorok szintén objektumok, valamint az egész űrlap hozzá van rendelve egy userhez, ez is egy ojjektum és még van sok szép mezője.

Na most ezt egy relációs adatbázisban tárolni lehet, egyfajta nested set megoldással, amiről szintén fogok írni (ha lesz rá kereslet), de valljuk be, a relációs adatbázisokat nem erre találták ki. Adjacency modellel (parent_id mezők és társai) tárolni mindezt pedig kész agyrém, mert 100 űrlap után kb. 5000 elemünk lenne az adatbázisban és minden egyes szintet/réteget külön kellene lekérdezni, vagy egy orbitális lekérdezést csinálni hozzá, ami nem a legoptimálisabb.

Az ilyen adatok tárolására nyújt nekünk segítséget a MongoDB. Ez az adatbázis a JSON-höz hasonló felépítésű dokumentumokat tárol. Egy-egy ilyen dokumentum egy vagy több mezőt tartalmazhat, ami mezők lehetnek tömbök, bináris adatok, netán "aldokumentumok". A mezők dokumentumonként változhatnak persze. Ez a flexibilitás lehetővé teszi, hogy dinamikusan változtassuk az adatmodelljeinket, ahogy új és új problémák/megoldások jönnek elő. Vegyük például azt az esetet, hogy egy új mezővel bővülne az űrlapunk. SQL-ben mindezt egy plusz mezővel tudnánk megoldani (hacsak nem az EAV model szerint építettük fel), ami üresen tátongana az addig létrehozott rekordokban és csak lassítaná a lekérdezéseket.

Nézzük meg, hogy néz ki egy ilyen dokumentum MongoDB-ben:

{"_id" : "4332adf34f2d4f4432d4f4e",
  "content" : {
      "subcontent" : {
          "key" : "value",
      },
   },
}

Ez egy igen egyszerű dokumentum, amiben jól látható a JSON-hoz hasonló szerkezet. Ezek a dokumentumok úgynevezett collection-ökbe vannak rendezve, amiket hasonlóan kell elképzelni az SQL-es table-ökhöz, azzal a különbséggel, hogy ezek a collection-ök nem határozzák meg az alájuk tartozó dokumentumok sémáját, vagyis nincs rákényszerítve semmilyen field szerkezet, ahogy ezt pl. egy SQL táblában megszokhattuk. Ezek a collection-ök pedig adatbázisokhoz vannak rendelve, ugyanúgy, ahogy SQL-ben is.

A telepítéshez egy igen jó útmutatót találunk a mongoDb honlapján, innen a linuxos verziót mesélném el, mivel jómagam linuxot használok, na meg a webszerverek többsége is, így jobb ezzel tisztában lenni.
Figyelem, a nyugalom megzavarására alkalmas bash script-ek következnek!



Először is szükségünk lesz a public key-re, amivel ellenőrízni tudja a Kubuntu a letöltött csomagok valódiságát. Ezt a következő paranccsal tudjuk elérni:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Ha ezzel megvagyunk, akkor elvileg a saját kis repository-nkba már importáltuk is Richard Kreuter barátunk publikus kulcsát. Utána tudatnunk kell a dpkg-vel, hogy a mongodb forrásfájlokat merre is találja:
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

Miután a rendszer már felvette a saját kis listájára a mongo forrásfájlokat, nem ártana frissíteni a package-ek listáját se:
sudo apt-get update

Most, hogy felvettük a package-k listájára a mongodb-t, nem fog hülyét kapni a rendszer a következő parancs láttán, amivel a tényleges telepítést végezzük:
sudo apt-get install -y mongodb-org

Amíg ezt leszedjük, addig dőljünk hátra, mert ez jópár megát leszed/telepít.

Ha kész, akkor elviekben magától el is indítja a mongodb-t, de ha mégse tenné, akkor a következő paranccsal lehet életet lehellni a rendszerbe:
sudo service mongod start

Feltelepült, melyik testrészemhez nyúljak?


Például az egér, mint periféria pont megfelelő lenne. Ha feltelepült és a var/log/mongodb/ könyvtárunk se duzzadt két gigásra a hibaüzenetektől, akkor a pongomongo paranccsal lehet előhívni a saját kis terminálját és barbárkodni, ahogy azt a mysql parancs után tennénk.

A szintaxis javascript-et idéző, úgyhogy senkinek ne legyen Deja vu érzése, nincs hiba a mátrixban:DieHardOriginal500
>db.trolo.save({"Bruce Willis":"Yipikaye"})

A fenti paranccsal létrehoztunk egy elemet a test adatbázison (ezt hozza létre telepítéskor) belül trolo collection-ben, aminek egy field-je van (az _id mezőn felül, ami minden dokumentumhoz szükséges a kereséshez), Bruce Willis névvel és ennek értéke Yipikaye.

Erre a terminál a következőképp fog reagálni:
WriteResult({nInserted: 1})

Na most messziről jött ember azt mondd, amit Laci, ezért nem hisszük csak úgy a terminalnak, hogy tényleg beszúrt egy elemet kérdezzük hát le a trolo collection elemeit:
>db.trolo.find()

Oké, úgy néz ki a mongodb maradhat, mert képes volt a CRUD első tagját végrehajtani, upvote!

Aki nem szereti ezt a felületet, és egy a phpmyadmin-hez hasonló elérést szeretne, akkor megnyugodhat, egy igen jó cross-platform program áll rendelkezésre UI-val, amit itt tölthet le.

Ez mind szép és jó, de mégis hogy fogjuk ezt elérni PHP-ből vagy bárhonnan? Nos a PHP oldalát még elmesélem, mert nem egy nagy ördöngősség. Ha felcsapjuk a révai nagylexikont a P betűnél,  akkor láthatjuk, hogy elég szép kis dokumentációt sikerült összedobni a srácoknak.

A PHP-vel való összeboronálására most nem térnék ki, mert fejlesztői környezete vállógatja, de akinek nem sikerülne, az jelezze és sort kerítek arra is!

Ha erre nem lesz precedens, akkor a következő részben végignézzük a különféle parancsokat, valamint azok visszatérési értékét és ezek kapcsán megismerkedünk majd az iterátorokkal is!

Hozzászólások betöltése
2014-2018 © Letscode.hu. Minden jog fenntartva. Build verzió: 1.2.12