Pull to refresh

Getting Started with MongoDB and PHP

Reading time 18 min
Views 61K
Original author: Vikram Vaswani
Generation Next
За последний год произошла небольшая революция в мире СУБД, связанная с появлением безсхемных (безструктурных) СУБД таких как Apache CouchDB. В этих базах данных используется другой подход нежели в реляционных БД. Они достаточно быстро становятся популярны среди Web-разрабочиков из-за своей гибкости, простоты и легкой интеграции с современными технологиями такими как JSON.
В данной статье изложен краткий обзор MongoDB, одной из новых поколений безсхемных СУБД, которая получила большое внимание разработчиков.

Start Me Up
На официальном сайте MongoDB написано, что это расширяемая, высокопроизводительная, документоориентированная БД с открытым исходным кодом. Существует под большое количество платформ и распространяется под лицензией GNU AGPL.
Хотя MongoDB и похожа на CouchDB, между ними существуют серьезные различия:
  • Разработчики MongoDB должны использовать встроенные в язык драйверы (native language drivers) для доступа к БД, в то время как для CouchDB используется REST
  • MongoDB поддерживает большее количество типов данных
  • Масштабируемость MongoDB строится на основе технологии sharding (русского аналога нет, оставил на английском), в то время как для CouchDB — это репликация.
  • Запросы MongoDB используют объекты BSON, в то время как запросы CouchDB генерируются с помощью JavaScript.

Документация MongoDB детально описывается все эти (и немного больше) различия, также имеются тесты сравнивающие MongoDB, CouchDB и MySQL (еще один повод для holy war).
Беглый обзор закончен, время для скачивания и установки MongoDB. В большинстве случаев стандартного бинарного пакеат хватает; он содержит MongoDB и клиент, работающий из командной строки, набор утилит для бэкапа, восстановления, а также сохранения и получения бинарных фалов. Для начала скачаем подходящую версию для вашей системы:
shell> cd /usr/local
shell> tar -xzvf mongodb-linux-i686-1.4.2.tgz
shell> ln -s mongodb-linux-i686-1.4.2 mongo
Если у вас Ubuntu, вы можете установить MongoDB используя aptitude. Для этого добавьте в /etc/apt/sources.list следующую строку:
deb downloads.mongodb.org/distros/ubuntu 10.4 10gen
Затем установите этот пакет используя aptitude:
shell> aptitude update
shell> aptitude install mongodb-stable
Когда пакет установлен запустите MongoDB сервер
shell> mkdir /usr/local/mongo/data
shell> /usr/local/mongo/bin/mongod --dbpath=/usr/local/mongo/data


Заметьте, что по умолчанию, сервер MongoDB server считает что данные сохраняются в /data/db, и заканчивает выполнение, если не находит этого пути. Параметр --dbpath позволяет указать другой путь.
Вы можете использовать командную строку для доступа к серверу, как это показано ниже:
shell>/usr/local/mongo/mongo
Вот как это выглядит:


Можно отдавать команды серверу, также как и в MySQL-клиенте. Ниже пример, который показывает версию сервера и доступные БД:
>show dbs
admin
local
>db.version()
1.4.2
>db.stats()
{
    "collections" : 0,
    "objects" : 0,
    "dataSize" : 0,
    "storageSize" : 0,
    "numExtents" : 0,
    "indexes" : 0,
    "indexSize" : 0,
    "ok" : 1
}

* This source code was highlighted with Source Code Highlighter.


Collecting Ideas
Во вселенной MongoDB, эквивалентом таблицы является «коллекция». Подобно тому, как таблицы имеют множество записей, в коллекциях — множество «документов». Эти документы представлены как JSON объекты, с полями и значениями представляющими пары ключ-значение, и сохраненные (сериализованы) в BSON (Binary JSON) для хранения. Ниже пример одного такого документа:
{
«orderDate»: «10-05-2010»,
«orderTotal»: 468.99,
}
Так как основной элекмент MongoDB это документ в формате JSON, а JSON поддерживает иерархические данные, вы можете включать один документ в другой. Далее, так как документы сериализуются в формат BSON для хранения, MongoDB может легко искать вложенные документы. Ниже пример:
{
«orderDate»: «10-05-2010»,
«orderTotal»: 468.99,
«shipTo»:
{
«street»: «17 Hill View»,
«zip»: «12345»,
«country»: «US»
}
}
Для создания новой MongoDB коллекции, запустите клиент в командной строке и выполните следующие команды, которые создадут коллекцию под названием items" и добавят несколько документов:
  1. > db.items.insert({ name: 'eggs', quantity: 10, price: 1.50 })
  2. > db.items.insert({ name: 'bacon', quantity: 3, price: 3.50 })
  3. > db.items.insert({ name: 'tomatoes', quantity: 30, price: 0.50 })
* This source code was highlighted with Source Code Highlighter.

Продолжаем дальше, добавьте еще документов как показано выше. Для отображения полного спика документов в коллекции вызовите метод find() без аргументов:
  1. > db.items.find({})
  2. { "_id" : ObjectId("4bea15293302000000006dcf"), "name" : "eggs", "quantity" : 10, "price" : 1.5 }
  3. { "_id" : ObjectId("4bea15463302000000006dd0"), "name" : "bacon", "quantity" : 3, "price" : 3.5 }
  4. { "_id" : ObjectId("4bea15523302000000006dd1"), "name" : "tomatoes", "quantity" : 30, "price" : 0.5
  5. }
* This source code was highlighted with Source Code Highlighter.

Заметьте, специальный ключ '_id' есть у каждого документа. Когда вы записываете новый документ в коллекцию, MongoDB автоматически добавляет уникальный идентификатор к каждому документу. Этот идентификатор может быть использован для получения или модификации документа, это некое подобие автоинкрементного ключа в реляционных базах данных.
Для отображения списка документов по какому-либо критерию, добавьте этот критерий (в виде объекта JSON) в метод find(). Ниже пример, показывающий записи с количеством большим 9 и ценой меньше 1:
  1. > db.items.find({quantity: {$gt: 9}, price: {$lt: 1}})
  2. { "_id" : ObjectId("4bea15523302000000006dd1"), "name" : "tomatoes", "quantity" : 30, "price" : 0.5
  3. }
  4.  
* This source code was highlighted with Source Code Highlighter.

Теперь давайте попробуем написать что-нибудь на php!

Hooking Things Up
Поддержка MongoDB в PHP реализована посредством расширения, которое обеспечивает API для доступа к коллекциям MongoDB. Это расширение разрабатывается Kristina Chodorow и бесплатно доступно в PECL под лицензией Apache License. Расширение стабильно и позволяет выполнять большинство задач, относящихся к доступу и использованию БД MongoDB database из приложений, написанных на языке PHP.
ДЛя того чтобы использовать это расширение установите его используя стандартную команду pecl
shell> pecl install mongo
Или вы можете скачать исходный код, скомпилировать его в загружаемый модуль PHP:
shell> tar -xzvf mongo-1.0.7.tar.gz
shell> cd mongo-1.0.7
shell> phpize
shell> ./configure
shell> make
shell> make install
Теперь у вас есть загружаемый PHP модуль под названием mongo.so, который находится в стандартном каталоге для модулей PHP. Подключите данное расширение в php.ini, перепустите Web-сервер и проверьте активность этого расширения командой phpinfo():


Теперь давайте посмотрим, что мы можем сделать, используя это расширение
  1. <?php
  2. try {
  3.  // open connection to MongoDB server
  4.  $conn = new Mongo('localhost');
  5.  
  6.  // access database
  7.  $db = $conn->test;
  8.  
  9.  // access collection
  10.  $collection = $db->items;
  11.  
  12.  // execute query
  13.  // retrieve all documents
  14.  $cursor = $collection->find();
  15.  
  16.  // iterate through the result set
  17.  // print each document
  18.  echo $cursor->count() . ' document(s) found. <br/>'
  19.  foreach ($cursor as $obj) {
  20.   echo 'Name: ' . $obj['name'] . '<br/>';
  21.   echo 'Quantity: ' . $obj['quantity'] . '<br/>';
  22.   echo 'Price: ' . $obj['price'] . '<br/>';
  23.   echo '<br/>';
  24.  }
  25.  
  26.  // disconnect from server
  27.  $conn->close();
  28. } catch (MongoConnectionException $e) {
  29.  die('Error connecting to MongoDB server');
  30. } catch (MongoException $e) {
  31.  die('Error: ' . $e->getMessage());
  32. }
  33. ?>
* This source code was highlighted with Source Code Highlighter.

В начале этого скрипта инициализируется новый объект Mongo, в конструктор которого передается информация, необходимая для установки соединения с сервером MongoDB (в примере имя хоста). Даный объект используется для всех последующих взаимодействий с сервером MongoDB.
Следующим шагом является получение доступа к базе данных. Это может быть сделано используя метод selectDB() или что более проще, посредством магического метода call, обратиться к базе как к свойству объекта. Как только получен доступ к базе данных не составит особого труда получить доступ к коллекции, испольуя метод selectCollection() или посредством магического метода call, обратившись к коллекции как к свойству. Коллекции предствавлены в виде объектов MongoCollection.
У каждого объекта MongoCollection есть метод find(), который может быть использован для выполнения запросов. Метод принимает в качестве аргументов два массива: массив параметров запросаи массив полей, которые долны быть получены в результате ответа на запрос. Возвращаемым значением является курсор, представленный объектом типа MongoCursor object. Тип MongoCursor реализует (implement) шаблон Iterator, поэтому достаточно легко пробежать по всему возвращаемому набору используя foreach(). Тип MongoCursor содержит метод count(), возвращающий количество записей.
PHP расширение Mongo поддерживает модель исключений, реализованную в PHP 5.x, и определяет 5 типов исключений: MongoConnectionException для ошибок, связанных с соединением, MongoCursorException и MongoCursorTimeoutException для ошибок связанных с запросом; MongoGridFSException для ошибок связанных с файловым взаимодействием; и MongoException для всех остальных ошибок. В предыдущем примере было бы неплохой идеей заключить код в try/catch блок.
Ниже пример вывода предыдущего примера:


Addition And Subtraction
Добавление нового документа в коллекцию достаточно просто. Посмотрите следующий пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // insert a new document
 $item = array(
  'name' => 'milk',
  'quantity' => 10,
  'price' => 2.50,
  'note' => 'skimmed and extra tasty'
 );
 $collection->insert($item);
 echo 'Inserted document with ID: ' . $item['_id'];
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Для добавление нового документа в коллекцию, создайте новый массив содержащий пару ключ-значение, которые вы хотите вставить (механизм поддерживает также вложенные массивы, которые конвертируются во встроенные документы) и передайте этот массив в метод insert объекта типа MongoCollection. Этот метод добавит документ в коллекцию и рассчитает значение '_id' (уникальный идентификатор документа), которое добавится в исходный массив. Этот идентификатор представляется специальным типом MongoId, который есть шестнадцатиричное представление идентификатора. Поэтому можно легко получить идентификатор документа, не делая дополнительный запрос.
Ниже пример:


Удаление документа из коллекции осуществляется методом remove(), который принимает в качестве параметров массив критериев, и удаляет все документы соответствующие этим критериям. Обычно remove() возвращает значение типа Boolean (true или false); однако, если передать специальный 'safe' аргумент в качестве второго аргумента позволит получить масиив с большим количеством информации, включающей в себя количество удаленных документов. Ниже пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // remove a document
 $criteria = array(
  'name' => 'milk',
 );
 $r = $collection->remove($criteria, array('safe' => true));
 echo 'Removed ' . $r['n'] . ' document(s).';
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Также возможно удалить документ, используя его идентификатор. Однако в метод remove() передается объект метода MongoId, а не строка PHP. Ниже пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // remove a document by ID
 $criteria = array(
  '_id' => new MongoId('4bea96b400f4784c0a070000'),
 );
 $collection->remove($criteria);
 echo 'Removed document with ID: ' . $criteria['_id'];
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Обновление документа происходит посредством метода save(), как показано ниже:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // retrieve existing document
 $criteria = array(
  'name' => 'eggs',
 );
 $doc = $collection->findOne($criteria);
 
 // update document with new values
 // save back to collection
 $doc['name'] = 'apples';
 $doc['quantity'] = 35;
 $doc['note'] = 'green apples taste sooooo good!';
 $collection->save($doc);
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Заметьте, что если findOne() ничего не возвратил, вызов save() добавит новый документ.
Asking Questions
Когда заходит речь о выполнении запросов, MongoDB предлагает достаточно гибкий инструментарий. Вы уже видели метод find(), который возвращает набор документов, соответствующий критериям поиска. Также есть метод findOne(), который возвращает один документ. Можно использовать множество критериев для поиска — просто передайте в качестве критериев поиска массив в find() или findOne(), а MongoDB применит все эти критерии с модификатором AND.
Ниже пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // formulate AND query
 $criteria = array(
  'quantity' => 30,
  'price' => 0.5
 );
 
 // retrieve only 'name' and 'price' keys
 $fields = array('name', 'price');
 
 // execute query
 $cursor = $collection->find($criteria, $fields);

 // iterate through the result set
 // print each document
 echo $cursor->count() . ' document(s) found. <br/>'
 foreach ($cursor as $obj) {
  echo 'Name: ' . $obj['name'] . '<br/>';
  echo 'Price: ' . $obj['price'] . '<br/>';
  echo '<br/>';
 }

 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

MongoDB также поддерживает большое количество условных и логических операторов для создания сложных запросов. Плюс к этому поддержка регулярных выражений. Ниже пример, который выводит все записи с количеством между 10 и 50 и чьи имена заканчиваются на 'es':
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // formulate complex query
 $criteria = array(
  'quantity' => array(
    '$gt' => 10,
    '$lt' => 50
   ),
  'name' => new MongoRegex('/es$/i')
 );
 
 // execute query
 $cursor = $collection->find($criteria);

 // iterate through the result set
 // print each document
 echo $cursor->count() . ' document(s) found. <br/>'
 foreach ($cursor as $obj) {
  echo 'Name: ' . $obj['name'] . '<br/>';
  echo 'Quantity: ' . $obj['quantity'] . '<br/>';
  echo 'Price: ' . $obj['price'] . '<br/>';
  echo '<br/>';
 }

 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Как это будет выглядеть:


Вы можете также изменить количество возвращаемых документов или отсортировать их по необходимому ключу, используя limit() и sort() методы. Ниже пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // execute query
 // sort by price
 // limit to 3 documents
 $cursor = $collection->find();
 $cursor->sort(array('price' => 1))->limit(3);
 
 // iterate through the result set
 // print each document
 echo $cursor->count() . ' document(s) found. <br/>'
 foreach ($cursor as $obj) {
  echo 'Name: ' . $obj['name'] . '<br/>';
  echo 'Quantity: ' . $obj['quantity'] . '<br/>';
  echo 'Price: ' . $obj['price'] . '<br/>';
  echo '<br/>';
 }

 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

Между прочим, если вы ходите узнать, как внутри MongoDB выполняет запрос, вы можете использовать метод explain() объекта MongoCursor для «look inside» системы обработки запросов, очень похоже на команду EXPLAIN у MySQL. Ниже пример и результат вывода:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // access collection
 $collection = $db->items;

 // execute and explain query
 $criteria = array(
  'quantity' => array(
    '$gt' => 10,
    '$lt' => 50
   ),
  'name' => new MongoRegex('/es$/i')
 );
 $cursor = $collection->find($criteria);
 $cursor->sort(array('price' => 1))->limit(3);
 print_r($cursor->explain());
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.



Rank And File
В дополнение к документам MongoDB также поддерживает бинарные данные. Бинарные данные до 4 MB могут быть сохранены в обычном документе, а данные (файлы), котороые больше этого размера, могут быть сохранены, использую маленькую штучку под названием GridFS.
GridFS это спецификация, описывающая дробление и сохранение больших файлов в MongoDB. Обычно, GridFS использует две коллекции: коллекция 'files', которая созраняет метаданные о каждом файле, и коллекция 'chunks', которая сохраняет данные, разделенные на кусочки (chunks). Каждый файл в коллекции 'files' collection имеет уникальный идентификатор, подобный идентификаторам других документов, хранимых в MongoDB; этот идентификатор можкт быть использован для получения или изменения файла.

Расширение MongoDB PECL обеспечивает набор классов MongoGridFS, которые могут быть использованы для взаимодействия с файлами, сохраненными с использованием GridFS. Каждый файл представлен экземпляром класса MongoGridFSFile, а каждый объект MongoGridFS предоставляет методы для добавления, удаления и поиска этих файлов.

Для лучшего понимания, рассмотрим следующий пример, который иллюстрирует процесс добавления изображения в MongoDB:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // get GridFS files collection
 $gridfs = $db->getGridFS();
 
 // store file in collection
 $id = $gridfs->storeFile('/tmp/img_2312.jpg');
 echo 'Saved file with ID: ' . $id; 
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.

В начале примера получается эксземпляр класса MongoGridFS, используя метод getGridFS() класса MongoDB, а затем методом storeFile() файл сохраняется в MongoDB. Если вы запустите этот пример, а затем посмотрите на содержимое вашей БД, вы увидите две новые коллекции 'fs.files' и 'fs.chunks'. Если вы взгляненте немного глубже в коллекцию 'fs.files', то вы увидите файл, корторый вы добавили.
> show collections
fs.chunks
fs.files
items
system.indexes
> db.fs.files.find()
{ "_id" : ObjectId("4beaa34f00f4784c0a300000"), "filename" : "/tmp/img_2312.jpg", "uploadDate" : "Wed May 12 2010 18:17:11 GMT+0530 (India Standard Time)", "length" : 11618, "chunkSize" : 262144, "md5" : "e66b9a33c7081ae2e4fff4c37f1f756b" }

* This source code was highlighted with Source Code Highlighter.

В качестве альтернативы the storeFile() существует метод storeUpload(), которые предназначен для использования совместно с загрузкой фалов, используя PHP. Использовать эту возможность очень легко: передайте в storeUpload название поля загрузки файла в форме, а MongoDB сама все сделает. Вы также можете передать название файла как второй аргумент.
Ниже небольшой пример:
<html>
 <head></head>
 <body>
  <form method="post" enctype="multipart/form-data">
   Select file for upload:
   <input type="file" name="f" />
   <input type="submit" name="submit" />   
  </form>
  <?php
  if (isset($_POST['submit'])) {
   try {
    // open connection to MongoDB server
    $conn = new Mongo('localhost');
   
    // access database
    $db = $conn->test;
   
    // get GridFS files collection
    $gridfs = $db->getGridFS();
    
    // check uploaded file
    // store uploaded file in collection and display ID
    if (is_uploaded_file($_FILES['f']['tmp_name'])) {
     $id = $gridfs->storeUpload('f');
     echo 'Saved file with ID: ' . $id;      
    } else {
     throw new Exception('Invalid file upload'); 
    }
        
    // disconnect from server
    $conn->close();
   } catch (MongoConnectionException $e) {
    die('Error connecting to MongoDB server');
   } catch (Exception $e) {
    die('Error: ' . $e->getMessage());
   }       
  }
  ?>
 </body>
</html>

* This source code was highlighted with Source Code Highlighter.

Имея файл в БД, как его получить обратно? Конечно же, используя идентификатор документа для получения файла (MongoGridFS является наследником MongoCollection, поэтому вы можете использовать find() и findOne()) в виде объекта класса MongoGridFSFile, а затем записать его на диск, используя метод write(), или вывести его куда-либо, используя getBytes(). Если вы используйте вывод в браузер, не забудьте добавить необходимый заголовок (header)!
Ниже пример:
<?php
try {
 // open connection to MongoDB server
 $conn = new Mongo('localhost');

 // access database
 $db = $conn->test;

 // get GridFS files collection
 $grid = $db->getGridFS();
 
 // retrieve file from collection
 $file = $grid->findOne(array('_id' => new MongoId('4beaa34f00f4784c0a300000')));
 
 // send headers and file data
 header('Content-Type: image/jpeg');
 echo $file->getBytes();
 exit; 
 
 // disconnect from server
 $conn->close();
} catch (MongoConnectionException $e) {
 die('Error connecting to MongoDB server');
} catch (MongoException $e) {
 die('Error: ' . $e->getMessage());
}
?>

* This source code was highlighted with Source Code Highlighter.


Boys And Their Toys
Хотя расширение PECL MongoDB предлагает достаточно удобные методы работы с MongoDB, вам может быть необходим более высокий уровень абстракции — скажем, например, если вы пытаетесь интегрировать MongoDB into в существующее приложение (framework-based application). В этом случае вы можете использовать Morph, «библиотеку высокого уровня для MongoDB», которая доступна бесплатно по лицензии GNU GPL.

Morph написан как шаблон ActiveRecord, позволяющий создать описание объекта MongoDB, расширяя основной класс Morph_Object. Эти экземпляры класса Morph_Object отражаются напрямую на документы MongoDB и имеют те же свойства и методы, с помощью которых можно работать используя стандартную объектную нотацию.

Для иллюстрации, предположим, что вы хотите созадть базу данных игрушек. Обычные атрибуты включают в себя имя (name), описание (description), возраст ребенка (age suitability), пол ребенка (gender suitability) и цену. Вы можете представить всю эту информацию в виде объекта класса Morph_Object:
<?php
class Toy extends Morph_Object {
 
 public function __construct($id = null)
 {
  parent::__construct($id);
  $this->addProperty(new Morph_Property_String('name'))
     ->addProperty(new Morph_Property_String('colors'))
     ->addProperty(new Morph_Property_Integer('minAge'))
     ->addProperty(new Morph_Property_Integer('maxAge'))
     ->addProperty(new Morph_Property_Enum('gender', null, array('boys', 'girls', 'both')))
     ->addProperty(new Morph_Property_Float('price'));
 } 
}
?>

* This source code was highlighted with Source Code Highlighter.

Теперь вы можете создать новый документ по этому шаблону, используя объект класса Toy, установить свойства и записать его, используя метод save(). Ниже пример:
<?php
require_once 'Morph.phar';

// initialize MongoDB connection
$mongo = new Mongo('localhost');

// select database for storage
$storage = Morph_Storage::init($mongo->selectDb('test'));

// create object and set properties
$toy = new Toy();
$toy->name = 'Ride Along Fire Engine';
$toy->colors = 'red,yellow';
$toy->minAge = '2';
$toy->maxAge = '4';
$toy->gender = 'both';
$toy->price = 145.99;

// save to database
$storage->save($toy);
echo 'Document saved with ID: ' . $toy->id();
?>

* This source code was highlighted with Source Code Highlighter.

Также, вы можете получить объект по идентификатору, обновить его и сохранить его обратно.
<?php
require_once 'Morph.phar';

// initialize MongoDB connection
$mongo = new Mongo('localhost');

// select database for storage
$storage = Morph_Storage::init($mongo->selectDb('test'));

// create object and set properties
$toy = new Toy();
$toy->loadById('5421d0b9fc6217c5bb929baa14a97e08');
$toy->name = 'Jumping Squid';
$toy->colors = 'red,orange,green,blue,yellow';
$toy->minAge = '2';
$toy->maxAge = '10';
$toy->gender = 'boys';
$toy->price = 22.99;

// save to database
$storage->save($toy);
echo 'Document saved with ID: ' . $toy->id();
?>

* This source code was highlighted with Source Code Highlighter.


Все эти примеры иллюстирируют — MongoDB обеспечивает надежную, богатую на возможности реализацию безсхемной СУБД. Доступность для различных платформ, легкая интеграция с PHP и другими языками и расширенная документация (плюс очень классые онлайн возможности для экспериментов) делают MongoDB идеальной для разработки современной, документо-ориентированной БД.
Tags:
Hubs:
+87
Comments 75
Comments Comments 75

Articles