Пример использования mongoDB

06.02.2014

MongoDb в Yii

Я не являюсь профессионалом использования этой БД, но некоторый опыт есть. На самом деле год назад я проходил онлайн курсы по python и mongodb, там и получил опыт.

В этой статье постараемся разобрать когда нужно использовать монго и с помощью чего это сделать в yii framework.

1. Что такое mongoDB

Документо-ориентированная СУБД, это означает что данные хранятся в json-подобных документах, которые объединены в коллекции. Таким образов монго содержит базы данных, внутри которых находятся коллекции (читай таблицы), ну а коллекции состоят из документов (читай строки таблицы).

Таблицы состоят из полей, но в отличие от реляционных СУБД, здесь используются динамические поля(т.е. в одной коллекции у разных документов могут быть разные поля).

Индексы в коллекциях очень похожи на аналогичные индексы в реляционных БД.

2. Применение mongoDB

Однозначного ответа на этот вопрос я не нашел. В большинстве статей пишут что монго удобнее mysql, ну пускай будет выше производительность, ок. Пускай лучше масштабируемость - ок. Адаптирована для высоконагруженных систем - дада, хорошая производительность, слышали.

Мне больше нравится мнение, что монгоДБ - это альтернатива реляционным базам данных. Т.е. не надо всё бросать и переходить на монго, но попробовать поработать однозначно стоит. С этой СУБД можно делать практически тоже что и с обычным mysql(правда отсутствуют транзакции, внешние ключи).

Опять же смотрите по ситуации, оправдывает или нет использование данной технологии в данных условиях.

Повторюсь - то что можно сделать на mongoDB, можно сделать и на mysql, а то что можно сделать на mysql, можно ни монго, с некоторыми допущениями.Возможно у вас есть опыт использования данной БД, в какой-то определенной ситуации, можете поделиться им в комментариях.

3. Элементарные операции над данными

Установка заняла ровно 4 команды в консоли, подробнее об установке для своей платформы читаем здесь - http://docs.mongodb.org/manual/installation/

Для доступа к монго используем консольную команду mongo:

MongoDB shell version: 2.4.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
    http://docs.mongodb.org/
Questions? Try the support group
    http://groups.google.com/group/mongodb-user
> |

3.1 Работа с базами данных

Для вывода списка баз данных используется команда show dbs, для переключения или создания новой БД выполняем use имя_базы_данных и в конце можем проверить действительно ли мы находимся в нужно нам БД - выполним команду db, которая вернет имя выбранной БД:

> show dbs
local    0.078125GB
> use testdb
switched to db testdb
> db
testdb
> 

3.2 Создание коллекции и вставка документа

При добавлении документа в коллекцию не нужно явно создавать эту коллекцию, если её ещё нет, монгоДБ сделает это налету при добавлении документа. Также не нужно явно определять структуру коллекции (поля), т.к. как я писал выше, в монго используется динамическая схема данных.

Итак, давайте создадим коллекцию users и добавим в неё пару документов:

db.users.insert({username : "admin", password : "mypass", email : "belyakov.u@gmail.com"})
db.users.insert({username : "test1", password : "mypass2", email : "test@gmail.com", is_active : 0})

Несколько пояснений: объект db указывает на нашу базу данных, созданную в предыдущем пункте, users означает имя коллекции, для которой мы будем применять метод вставки документа insert. И следом мы добавляем 2 документа (записи) с разным количеством полей.

3.3 Просмотр коллекций и выборка данных

Для просмотра коллекций используется команда show collections, а для выборки данных используется метод коллекции find():

> show collections
system.indexes
users
> db.users.find()
{ "_id" : ObjectId("52f1add4201c223fc62cf7ba"), "username" : "admin", "password" : "mypass", "email" : "belyakov.u@gmail.com" }
{ "_id" : ObjectId("52f1adf0201c223fc62cf7bb"), "username" : "test1", "password" : "mypass2", "email" : "test@gmail.com", "is_active" : 0 }
> 

Видно, что каждый документ содержит уникальный идентификатор, который задается автоматически самой монго.

3.4 Обновление данных

Для обновления используется метод коллекции update({что обновляем}, {какие значений устанавливаем}):

> db.users.update({username : "admin"}, {$set : {password: "newPass"}})

Более наглядное объяснение нашел в документации монго:

Обновление данных в mongodb

Или тоже самое в SQL-синтаксисе:

Обновление данных в SQL

3.5 Удаление данных

Используем метод коллекции remove({условия}):

> db.users.remove({username: "test1"})

Использование remove без параметров удалит все документы из коллекции.

3.6 Удаление коллекций

> db.drop_collection(“users”);

4. Использование mongoDB совместно с Yii framework

Для начала работы с монго из php нужно установить php-драйвер для работы с ней. В линукс для этого нужно выполнить команду:

sudo pecl install mongo

Добавить extension=mongo.so в php.ini и перезапустить сервер. Если всё правильно - сейчас стало возможным использовать классы драйвера, но мы хотим, чтобы использование монго было таким же, как использование обычных AR-моделей.

Для этой цели давайте воспользуемся расширением YiiMongoDbSuite. Подключаем его как написано в документации:

'import' => array(
  ...
  'ext.YiiMongoDbSuite.*',
),
…
'components' => array(
  ...
  'mongodb' => array(
      'class'            => 'EMongoDB',
      'connectionString' => 'mongodb://localhost',
      'dbName'           => 'testdb',
      'fsyncFlag'        => true,
      'safeFlag'         => true,
      'useCursor'        => false
  ),
),

В качестве БД выбираем выше созданную базу users. Ну и последнее что остается - описать модель:

class Users extends EMongoDocument
{
    public $username;
    public $passowrd;
    public $email;
    public $is_active;

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function getCollectionName()
    {
        return 'users';
    }

    public function rules()
    {
        return array(
            array('username, password, email', 'required'),
            array('username, password, email', 'length', 'max' => 255),
            array('is_active', 'numerical', 'integerOnly' => true),
        );
    }

    public function attributeLabels()
    {
        return array(
            'username'  => 'Имя пользователя',
            'password'   => 'Пароль',
            'email'   => 'E-mail',
            'is_active' => 'Актывный пользователь?'
        );
    }
} 

Как видим всё тоже, что и в обычно модели. Работать с ней точно также как с обычной AR, точно такой же CRUD, не буду его демонстрировать, там и так всё ясно.

Добавлю - это расширение позволяет больше, чем просто создавать AR-подобные модели, также можно определять модели как встраиваемые документы, сохранять обычные php массивы прямо в БД и т.д. Обо всех тонкостях можно почитать в документации к расширению.

Ссылки

Теория по MongoDB

Php и MongoDB

Yii & MongoDB

blog comments powered by Disqus
Наверх