Статьи

Введение в MongoDB

Как разработчик PHP вы, вероятно, привыкли видеть приложения и статьи, использующие MySQL или какую-либо другую систему управления реляционными базами данных (RDBMS). Но в последние несколько лет в сообществе разработчиков программного обеспечения появилась новая база данных. Этот новый тип базы данных ориентирован на объекты документа, а не на строго определенные записи и отношения, и получил прозвище «NoSQL».

Существует множество реализаций концепции NoSQL, но одной из самых известных и широко используемых баз данных NoSQL является MongoDB. Я думаю, что это одна из самых интересных баз данных NoSQL, доступных в настоящее время, и многие считают ее одной из самых простых в использовании (что помогло ей получить широкое распространение).

В этой статье я познакомлю вас с NoSQL с MongoDB. Вы узнаете, как установить расширение MongoDB для PHP, а также как добавлять, обновлять и извлекать объекты документов. Если вы привыкли работать с такими СУБД, как MySQL или PostgreSQL, вы найдете некоторые концепции работы с MongoDB несколько странными, но вскоре вы полюбите гибкость и мощь, которые дает вам MongoDB!

О MongoDB

MongoDB — это документно-ориентированная база данных, и каждый документ имеет свою структуру. В отличие от СУБД, в которой каждая запись должна соответствовать структуре своей таблицы, каждый документ в MongoDB может иметь различную структуру; вам не нужно определять схему для документов перед сохранением их в базе данных.

MongoDB группирует объекты документа в коллекции . Вы можете думать о коллекции как о таблице, которую вы бы создали в СУБД, но, как я уже говорил, разница в том, что они не заставят вас определять схему, прежде чем вы сможете что-то сохранить.

С MongoDB вы можете встроить документ в другой, что действительно полезно в тех случаях, когда существует отношение один к одному. В типичной СУБД вам потребуется создать две таблицы и связать их вместе с внешним ключом, чтобы достичь того же результата. MongoDB не поддерживает объединения, которые некоторые люди считают мошенничеством. Но если вы правильно упорядочите свои данные, то обнаружите, что вам не нужны объединения, это профессионал, поскольку вы выиграете от очень высокой производительности.

Стоит упомянуть, что целью MongoDB и NoSQL не является уничтожение RDBMS. СУБД по-прежнему являются очень хорошим решением для большинства потребностей мира разработчиков, но у них есть свои слабые стороны, особенно заметная необходимость определения жесткой схемы для ваших данных, что является одной из проблем, которые NoSQL пытается решить.

Установка

MongoDB прост в настройке. Вы можете скачать сжатый файл последней версии со своего веб-сайта и распаковать его на свой сервер. Затем создайте каталог для базы данных и запустите mongod файл mongod с путем к каталогу вашей базы данных.

  shreef @ indigo: ~ $ tar zxf mongodb- <версия> .tgz
 shreef @ indigo: ~ $ mv mongodb- <версия> mongodb
 shreef @ indigo: ~ $ mkdir mongodb / data
 shreef @ indigo: ~ $ mongodb / bin / mongod --dbpath mongodb / data & 

Затем вам нужно установить расширение MongoDB для PHP из PECL.

  shreef @ indigo: ~ $ sudo pecl установить Монго 

Включите расширение в вашем php.ini и перезапустите Apache, если это необходимо.

  расширение = mongo.so 

Использование MongoDB

Использовать PHP-расширение MongoDB очень просто. Я покажу вам, как выполнять основные операции, которые вы будете использовать чаще всего, и выделю некоторые распространенные ошибки, с которыми вы можете столкнуться.

соединительный

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

 <?php // connects to localhost on port 27017 by default $mongo = new Mongo(); // connects to 192.168.25.190 on port 50100 $mongo = new Mongo("mongodb://192.168.25.190:50100"); 

Далее вам нужно выбрать имя базы данных, которую вы собираетесь использовать. Если вы хотите получить доступ к базе данных с именем blog, просто выберите ее, как если бы она была свойством $mongo .

 <?php $db = $mongo->blog; 

$db теперь содержит объект MongoDB представляющий базу данных блога.

Выбор коллекции, в которой вы хотите сохранить ваши объекты, очень похож на выбор базы данных; выберите коллекцию сообщений , обратившись к ней как к свойству объекта MongoDB .

 <?php $collection = $db->posts; 

$collection теперь содержит объект MongoCollection представляющий коллекцию сообщений.

Если нет базы данных или коллекции с указанным вами именем, MongoDB создаст новую с этим именем, как только вы вставите свой первый объект документа. В качестве альтернативы вы можете заставить MongoDB создать коллекцию ранее, используя метод createCollection() .

 <?php $collection = $db->createCollection("posts"); 

Вставка документов

Чтобы вставить новый объект в коллекцию публикаций, вы используете MongoCollection insert() объекта MongoCollection , передавая массив данных для сохранения.

 <?php $document = array( "title" => "cat with a hat", "content" => "once upon a time a cat with a hat ..."); $collection->insert($document); 

Вы можете видеть, что $document — это просто простой ассоциативный массив. После вызова insert() массив изменяется с новым ключом _id и добавлением значения экземпляра объекта MongoId .

  массив
 (
     [title] => кот в шляпе
     [content] => однажды кот в шляпе ...
     [_id] => Объект MongoId
         (
             [$ id] => 4ea2213af7ede43c53000000
         )
 ) 

_id является первичным ключом для документа и должен быть уникальным для каждого объекта документа в коллекции. Как правило, хорошей идеей будет позволить MongoDB назначить ключ, так как тогда вы можете быть уверены, что столкновений не будет.

Если вы попытаетесь снова использовать тот же массив с insert() вы получите MongoCursorException так как идентификатор уже существует в коллекции. Идите и попробуйте вставить один и тот же документ дважды …

 <?php $document = array( "title" => "cat with a hat", "content" => "once upon a time a cat with a hat ..."); $collection->insert($document); $collection->insert($document); 

Хм, а это что? Нет исключения было выброшено?

Вы не получили ошибку, потому что вы не делаете безопасную вставку . Расширение MongoDB для PHP по умолчанию выполняет все операции асинхронно, поэтому вам не нужно ждать, пока сервер ответит, что данные были успешно сохранены. Эта функция позволяет перейти к следующей задаче, не дожидаясь подтверждения того, были ли данные сохранены или нет, и это может быть очень удобно, но для важных данных вы можете захотеть убедиться, что объект документа действительно был сохранен и никаких ошибок не произошло. Вы можете достичь этого, передав массив во втором параметре insert() с ключом safe, установленным в true.

Попробуйте еще раз, но на этот раз передайте второй параметр insert() .

 <?php $insertOpts = array("safe" => true); $collection->insert($document, $insertOpts); $collection->insert($document, $insertOpts); 

Теперь вы получите исключение, о котором я упоминал ранее, поскольку вы выполняете безопасную вставку, а другой объект с таким же идентификатором уже существует в коллекции.

Обновление документов

Если вы хотите изменить существующий объект документа, вы можете использовать метод save() .

 <?php $document["author"] = "Shreef"; $collection->save($document); 

Если переданный массив не имеет ключа _id , документ будет вставлен и будет назначен первичный ключ. Если массив уже имеет ключ _id, объект документа будет обновлен. Как и insert() , save() также принимает необязательный второй параметр.

Метод save() — не единственный способ обновить существующий объект; Вы также можете использовать метод update() . update() принимает критерии объекта, который вы хотите обновить, в качестве первого параметра, а обновленный объект — в качестве второго параметра.

Допустим, я хочу найти все объекты, ключ автора которых равен «Shreef», и обновить значение до «Timothy». Я мог бы попробовать следующее:

 <?php $collection->update( array("author" => "Shreef"), array("author" => "Timothy")); 

Хотя это работает, оно также имеет непреднамеренное последствие удаления всех других полей в соответствующих документах; единственные поля, которые у них были бы, были бы автором ! Это не то, что я хотел. Чтобы обновить только значение ключа автора и оставить остальные ключи / значения нетронутыми, необходимо использовать модификатор $set .

 <?php $collection->update( array("author" => "Shreef"), array('$set' => array("author" => "Timothy"))); 

Но это все еще не совсем то, что я хотел, так как MongoDB обновит только первый соответствующий объект, который он найдет. Чтобы обновить все соответствующие объекты документа, вам нужно передать массив в качестве третьего параметра для update() с ключом множественного числа, установленным в значение true.

 <?php $collection->update( array("author" => "Shreef"), array('$set' => array("author" => "Timothy")), array("multiple" => true)); 

Наконец я могу обновить все соответствующие записи так, как я хотел. Модификатор $set обеспечивает обновление только значения ключа автора , а множественный ключ сообщает MongoDB об обновлении каждого соответствующего объекта документа, который он находит.

Выбор документов

Чтобы выбрать все сохраненные документы из коллекции, которые соответствуют некоторым критериям, вы используете метод find() . Метод принимает критерии вашего запроса в качестве первого параметра и, необязательно, в качестве второго параметра, он может взять массив имен полей, которые нужно вернуть вместо всего объекта.

 <?php $cursor = $collection->find(array("author" => "shreef")); foreach ($cursor as $document) { print_r($document); } 

find() возвращает объект MongoCursor который вы можете использовать для перебора результатов.

Если вы хотите получить только одно значение, вы можете использовать метод findOne() который будет возвращать только массив с полями первого соответствующего объекта.

 <?php $document = $collection->findOne(array("author" => "shreef")); print_r($document); 

Резюме

MongoDB — это очень простая, но мощная база данных, которую вы можете использовать, если у вас большие объемы неструктурированных данных. Есть много, намного больше возможностей, чем то, что я упомянул в этой статье, и, возможно, я напишу еще одну статью, обсуждая некоторые из них в будущем. До этого старайтесь следовать примерам, упомянутым в статье, и не стесняйтесь оставлять комментарии на любые ваши вопросы.

Изображение через график / Shutterstock