Agudo

web2

t: 504 426 710 e: pawel@agudo.pl

MongoDB - wstęp do słownikowej bazy danych w PHP

Data: 16.02.2010

MongoDb jest słownikową bazą danych napisaną w języku C++. Główne atuty projektu to skalowalność, wydajność i brak narzutu na ilość kluczy w kolekcji(tabeli). Czyli przykładowo dokument(wiersz) z kolekcji users może wyglądać tak.

$users = array(
	'0' => array(
			'login' => 'user1',
			'password' => '@#$DF@#rfdfg',
			'sex'	=> 'm'
	),
	'1' => array(
			'login' => 'user2',
			'password' => '2343423423g',
			'sex'	=> 'm'
			'www' => 'http://agudo.pl',
			'description' => 'MongoDB php'
			'e-mail' => 'agudo@example.org'
	),
);

Poniżej opisze kilka podstawowych operacji wykorzystując sterownik PHP.

1. Uruchamianie serwera

Instalacja mongoDB. W moim przypadku wystarczyło w terminalu wykonać komendę:

$ sudo port install php5-mongo
$ mkdir /data/db
$ sudo /opt/local/bin/mongod

W pierwszej linijce pobieram i "łączę" bazę danych z php, w drugiej tworze katalog który domyślnie wykorzystuje serwer do przechowywania danych. Na końcu pozostaję już tylko uruchomić serwer.

Najprawdopodobniej więcej szczegółów na temat instalacji na pewno znajdziesz na stronie http://www.mongodb.org/ dokładniej tutaj.

2. Struktura bazy danych

Tak jak wcześniej wspomniałem w MongoDB "nie mamy" tabel i wierszy odpowiadają im kolejno kolekcje i dokumenty. Jeśli mamy skonfigurowany i odpalony serwer MongoDB możemy się połączyć i wybrać bazę danych. A wystarczą do tego dwie proste linijki.

$connection = new Mongo();
$db = $connection->selectDB('blog');

Oczywiście mamy możliwość konfiguracji połączenia w konstruktorze podając parametr w postaci 'mongodb://username:password@localhost:2171'.

$connection = new Mongo('mongodb://username:password@localhost:2171');

3. Wprowadzanie(insert) danych

Dodawanie dokumentów jest niezwykle proste - wykorzystujemy metodę insert() z obiektu MongoCollection.

$collection = $this->db->selectCollection('news');
   
$news = array(
		'title' => 'Tytuł wiadomości',
		'text'	=> 'Treść wiadomości',
		'date'	=> time(),
	);
$collection->insert($news);

4. Pobieranie(select) danych

Jeśli już mamy jakieś dane w kolekcji możemy je pobrać. Tu do wykorzystania mamy dwie metody find() oraz findOne(). Obie te metody mogą przyjmować dwa parametry w postaci tablic. Pierwszą parametr jest "zapytaniem", czyli kopiując przykład z manuala zapytanie dla którego pole x jest większe od 5 i mniejsze od 20.

$rangeQuery = array('x' => array( '$gt' => 5, '$lt' => 20 ));
$cursor = $collection->find($rangeQuery);

Pobrania jednego dokumentu z dwoma etykietami title i date z punktu trzeciego.

$query = array('title' => 'Tytuł wiadomości');
$labels = array('title', 'date');
$cursor = $collection->findOne($query, $labels);

Drugim parametrem find() i findOne() to lista pól które zostaną zwrócone.
W wypadku braku wyników zmienna $coursor będzie równa null.

5. Aktualizacja(update) danych

Do edycji danych mamy metodę update() która może przyjąć trzy parametry. Na początku podajemy kryteria aby znaleźć dokument do edycji, później podajemy zaktualizowany obiekt. Na końcu możemy podać tablicę z parametrami(ustawieniami):
- upsert jeśli nie znaleziony zostanie żaden obiekt pasujący do kryteriów zostanie stworzony nowy dokument
- multiple jeśli ustawiamy ten parametr zostaną zaktualizowane wszystkie dokumenty pasujące do kryteriów ponieważ domyślnie odświeżany jest tylko jeden.
Przykłady:

$query = array('title' => 'Tytuł wiadomości');
$new =  array(
		'title' => 'Nowy tytuł wiadomości',
		'text'	=> 'Nowa treść wiadomości',
		'date'	=> time(),
	);
$collection->update($query, $new);

Jeśli chcemy dodać do wszystkich dokumentów pole comments.

$new =  array('$set' => array('comments' => '0'));
$collection->update(array('date' => array( '$gt' => 0)), 
                      $new, 
                      array('multiple' => 1, 'upsert' => 0));

6. Usuwanie(delete) dokumentów z bazy

Dokumenty z kolekcji usuwamy poprzez metodę remove(). Atrybuty jakie ona pryzmuje to tablica kryteriów i wartość logiczną odpowiadającą za usuwanie jednego elementu - domyślnie ustawiona false.

$collection->remove(array('title' => 'Tytuł wiadomości'), true);

Usunie tylko jeden dokument z kolekcji.


W następnym wpisie postaram się opisać jak stworzyć prosty blog używając MongoDB z wykorzystaniem Zend Framework.