MongoDB

Материал из SoftTimeINFO
Перейти к: навигация, поиск

MongoDB — документ-ориентированная система управления базами данных (СУБД), в отличие от традиционных реляционных баз данных, таких как MySQL или PostgreSQL не использует табличный способ представления со связями через внешние ключи, а хранит данные в виде JSON-объектов. Среди достоинств СУБД отмечают легкость интеграции с объектно-ориентированными приложениями (не требуется ORM, как в случае реляционных баз данных), хорошую горизонтальную масштабируемость, заложенную на уровне архитектуры, возможность динамического расширения структуры базы данных. Если хранение сериализованных объектов в полях в традиционной СУБД является антипатерном, так как теряется возможность поиска по таким сериализованным полям и участия атрибутов в запросах, то в MongoDB хранение объектов и поиск по атрибутам — это краеугольная особенность базы данных. В тоже время, MongoDB предоставляет все возможности традиционных СУБД, будь то условные запросы или индексирование.

MongoDB довольно молодая система управления базами данных (первая версия датирована ноябрем 2009 года) и спроектирована как элемент облачной инфраструктуры. Поэтому в СУБД сразу заложены идеи горизонтального масштабирования за счет репликации.

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

Коллекции невозможно соединять на уровне СУБД, как обычно поступают с таблицами в реляционных СУБД, все соединения осуществляются на стороне клиента. Однако, документ может хранить всю необходимую информацию: от текста и набора изображений, до комментариев и типов цен. Информация храниться в формате JSON (точнее его бинарном представлении BSON), в качестве языка запроса используется JavaScript и JSON-структуры.

Содержание

[править] Установка

[править] Windows

Для установки MondoDB в Windows необходимо загрузить последний стабильный дистрибутив со официального сайта. Следует ориентироваться на раздел Production Release (Recommended), выбирая 32 или 64-разрядную версию в зависимости от используемой операционной системы. Загруженный архив содержит готовый к использованию дистрибутив, не требующий предварительной установки.

В Widnows СУБД MongoDB хранит базы данных в каталог данных, который располагается по пути C:/data/db. Если каталог данных отсутствует, его необходимо создать. Будет разумным распаковать загруженный архив по пути C:/data/, основное содержимое архива составляет папка bin с утилитами MongoDB. В результате каталог data будет иметь следующую структуру

C:/
  data/
    bin/
    db/

[править] Linux (Ubuntu)

Для установки MongoDB в Unbuntu необходимо добавить канал распространения компании 10gen, выпускающей MongoDB

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/10gen.list
sudo apt-get update

После этого можно установить последнюю стабильную версию MongoDB при помощи команды

sudo apt-get install mongodb-10gen

[править] Управление сервером

[править] Windows

[править] Запуск сервера

Для запуска сервера, следует перейти в папку C:/data/bin и запустить сервер mongod.exe, остановить сервер можно при помощи комбинации Ctrl + C. Для того, чтобы обращаться к утилитам MongoDB можно было из любой папки следует прописать путь C:/data/bin в переменной окружения PATH. Для этого в Windows 7 правой кнопкой мыши нажмите на иконку Мой компьютер и в контекстном меню выберите пункт Свойства и далее Дополнительные параметры системы. На вкладке дополнительно нажмите на кнопку Переменные среды….

Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения
Дополнительные параметры системы

В открывшемся диалоговом окне следует выбрать переменную окружения Path и нажать кнопку Редактировать

Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения
Переменные среды…

Пути в переменной окружения Path разделяются точкой с запятой, поэтому в конец следует добавить ;C:\data\db, сохранить результаты и перезагрузить компьютер.

[править] Конфигурирование сервера

Для настройки сервера сервера, можно создать конфигурационный файл C:\data\mongod.cnf, путь к нему необходимо передавать серверу через параметр --config

mongod.exe --config C:/data/mongod.cnf

При помощи директив файла mongod.cnf можно управлять параметрами сервера.

[править] Журналирование работы сервера

По умолчанию сервер, выводит логи в консоль, в которой он запущен, однако, этот вывод можно перенаправить, воспользовавшись директивой logpath конфигурационного файла mongod.cnf, в которой можно указать путь к лог-файлу

logpath=C:/data/log/mongo.log

В качестве альтернативы можно воспользоваться параметром --logpath, через который путь к логу указать напрямую, не прибегая к mongod.cnf

mongod.exe --logpath C:/data/log/mongo.log

Папка C:/data/log должна существовать на момент запуска сервера с данными параметрам logpath. В случае существования log-файла mongo.log, запись будет вестись в альтернативный файл формата mongo.log.2013-07-25T19-59-59.

[править] Автозапуск сервера

Для автоматического запуска сервера в момент старта операционной системы и остановки его при выключении компьютера удобно воспользоваться сервисами или службами Windows. Для создания сервиса для MongoDB можно воспользоваться следующей командой (консоль должна быть запущена из под администратора)

mongod.exe --config C:/data/mongod.cnf --install

После чего сервис можно запускать при помощи команды

net start MongoDB

Останавливать сервис можно при помощи команды

net stop MongoDB

Удаление сервиса производится при помощи запуска сервера с параметром --remove

mongod.exe --remove

Управлять сервисом можно посредством графического интерфейса, для того, чтобы вызывать панель управления сервисами, нажмите правой кнопкой мыши на иконку Мой компьютер, в открывшемся контекстном меню выберите Управление, далее Службы и приложения, Службы. Открыть панель управления сервисами можно через Панель управления, выбрав пункт Система и безопасность, далее Администрирование и Службы. Если команда установки сервиса была выполнена корректна, в открывшемся списке можно выбрать сервис Mongo DB.

Ошибка создания миниатюры: Не удаётся сохранить эскиз по месту назначения
Управление службами Windows

При помощи панели можно запустить или остановить сервис, кроме того, выбрав в контекстном меню пункт Свойства, можно настроить автоматически или ручной запуск службы.

[править] Linux (Ubuntu)

[править] Демон mongodb

Управление сервером осуществляется при помощи команды service, следующая команда запускает сервер

sudo service mongodb start

Для остановки сервера следует выполнить

sudo service mongodb stop

Для перезапуска следует передать параметр restart

sudo service mongodb restart

Если в полном перезапуске сервера нет необходимости, можно лишь перечитать конфигурационные файлы, воспользовавшись параметром reload

sudo service mongodb reload

[править] Конфигурационный файл

В Ubuntu конфигурационный файл MongoDB находится по пути /etc/mongodb.conf.

[править] Восстановление сервера

Если сервер останавливается нештатно, очень часто базы данных оказываются повреждены. Проверить запущен ли сервер mongod можно при помощи команды

ps -aux | grep /usr/bin/mongod

Кроме того, клиент mongo отказывается соединяться с сервером, если он не запущен. Выяснить причины отказа старта сервера можно в журнальном файле /var/log/mongodb/mongodb.log. Как правило, если сервер остановлен не штатно, можно увидеть надпись

************** 
Unclean shutdown detected.
Please visit http://dochub.mongodb.org/core/repair for recovery instructions.
*************

Запустить восстановление базы данных можно при помощи команды

sudo mongod --dbpath /var/lib/mongodb --repair

иногда при помощи параметра --repairpath требуется указать дополнительную папку (должна существовать), куда будут складироваться восстановленные данные

sudo mongod --dbpath /var/lib/mongodb --repair --repairpath /var/lib/mongodb1

Следует иметь в виду, что из под команда sudo файлы переписываются из под пользователя root, поэтому после восстановления следует поменять владельца и группу файлов при помощи команды

chown -R mongodb:nogroup /var/lib/mongodb

[править] Проверка работоспособности

Для проверки работоспособности следует запустить клиент mongo

mongo

В случае успешной связи с сервером команда выведет версию MongoDB и сообщит, что текущей является база данных test

MongoDB shell version: 2.4.5
connecting to: test

Если в ответ на соединение выдается сообщение об ошибке couldn't connect to server 127.0.0.1 shell/mongo.js следует выполнить следующий набор команд

sudo rm /var/lib/mongodb/mongod.lock
sudo -u mongodb mongod -f /etc/mongodb.conf --repair
sudo service mongodb restart

[править] Базы данных

Базы данных предназначены для хранения коллекций документов. Место их расположения задается директивой dbpath конфигурационного файла (как вариант параметр --dbpath сервера). Если параметр не задан, сервер ищет файлы базы данных по пути /data/db (C:/data/db в Windows). В Ubuntu в качестве каталога для хранения баз используется каталог /var/lib/mongodb.

В каталоге данных для каждой базы данных создается несколько файлов, имена которых совпадают с названием базы данных. 16-мегабайтный файл с расширением ns (сокращение от namespace) предназначен для пространства имен коллекций и индексов. 64-магабайтный файл с расширением 0, является первым файлом данных, следующий файл с расширением 1 имеет объем 128 мегабайт, следующий файл с расширением 2 — 512 мегабайт и так далее до 2 гигабайт, после чего все последующие файлы имеют размер 2 гигабайта. Файлы добавляются по мере увеличения размера базы данных.

[править] Список баз данных

Получить список доступных баз данных можно при помощи команды

show dbs

В качестве результат возвращается список доступных баз данных и занимаемый ими объем в гигабайтах.

[править] Выбор базы данных

Как упоминалось в предыдущем разделе, сразу после установки соединения клиента mongo с сервером, текущей базой данных является база данных test. Для того, чтобы переключиться на другую базу данных из списка, возвращаемого командой show dbs, следует использовать команду use. В следующем примере происходит переключение на новую базу данных database

use database
switched to db database

[править] Создание и удаление базы данных

Не существует явного способа создания базы данных, база данных создается автоматически при записи в любую из её коллекций документа. Однако, для удаления базы данных существует специальный метод dropDatabase()

use database
db.dropDatabase()

Здесь db — это псевдоним, обозначающий текущую базу данных, которая выбирается при помощи команды use.

[править] Статистика базы данных

Выяснить текущее состояние базы данных и занимаемый ей размер можно при помощи метода stats()

db.stats()
{
	"db" : "test",
	"collections" : 5,
	"objects" : 100020,
	"avgObjSize" : 40.00359928014397,
	"dataSize" : 4001160,
	"storageSize" : 11280384,
	"numExtents" : 11,
	"indexes" : 4,
	"indexSize" : 5796784,
	"fileSize" : 201326592,
	"nsSizeMB" : 16,
	"dataFileVersion" : {
		"major" : 4,
		"minor" : 5
	},
	"ok" : 1
}

Поле db сообщает текущее название базы данных, collections — количество коллекций, indexes — количество индексов, objects — количество объектов, содержащихся в базе данных, avgObjSize — средний размер объекта. Поле fileSize сообщает о размере дискового пространства зарезервированного под базу данных, фактически это сумма файлов коллекции в каталоге данных. Поле dataSize сообщает объем всех BSON-объектов базы данных. Поле storageSize сообщает объем, занимаемый BSON-объектами с учетом места зарезервированного для роста коллекций и областями, оставшимися после удаленных объектов. Поле nsSizeMB сообщает о размере пространства имен (ориентируется на размер файла с расширением ns в каталоге данных). dataFileVersion — сообщает версию BSON-формата.

В каждой базе данных существует системная коллекция system.namespaces, которая содержит пространства имен базы данных (физически данные этой коллекции хранятся по ns-файлам)

db.system.namespaces.find();
{ "name" : "test.test" }
{ "name" : "test.system.indexes" }
{ "name" : "test.test.$_id_" }
{ "name" : "test.mybase.$_id_" }
{ "name" : "test.mybase" }
{ "name" : "test.articles.$_id_" }
{ "name" : "test.articles" }

Помимо system.namespaces, каждая база данных имеет системную коллекцию system.indexes

db.system.indexes.find();
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.test", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.mybase", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.articles", "name" : "_id_" }

[править] Коллекции

Коллекции предназначены для хранения документов и сами в свою очередь хранятся в базах данных. Имя коллекции может содержать символы английского алфавита, цифры и точку. MongoDB поддерживает расширенные имена, включающее имя базы данных и имя коллекции, разделенные точкой. Например, коллекция articles из базы данных test имеет полное имя test.articles. Обычно вместо точного названия базы данных используется псевдоним db, ссылающийся на текущую базу данных, выбранную при помощи оператора use. Полное имя не должно превышать 128 символов.

Коллекции подразделяются на следующие виды:

  • стандартные — создаются по умолчанию;
  • ограниченные — коллекции постоянного размера, при достижении которого старые записи удаляются автоматически, освобождая место для новых;
  • системные — коллекции предназначенные для внутреннего использования, а также выполняющие статистическую роль информационной схемы в реляционных СУБД. Примерами таких коллекций служат system.namespaces и system.indexes из предыдущего раздела.

[править] Создание коллекции

Явного создания коллекции не требуется — она создается неявно при вставке в неё первого документа. Однако, при необходимости можно воспользоваться методом createCollection()

db.createCollection("articles")

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

db.createCollection("articles", {size: 64000})

Для того, чтобы создать ограниченную коллекцию, помимо размера, необходимо установить атрибут capped в значение true

db.createCollection("articles", {capped: true, size: 64000})

По достижению размера, заданного атрибутом size старые записи будут удаляться автоматически, размер коллекции при этом будет оставаться постоянным.

[править] Список коллекций

Просмотреть список текущих коллекций можно при помощи команды

show collections

[править] Переименование коллекции

Для переименования коллекции предназначен метод renameCollection()

db.articles.renameCollection("pages")

[править] Удаление коллекции

Для удаления коллекции, вместе со всеми индексами и документами можно воспользоваться методом drop()

db.articles.drop()

[править] Статистика коллекций

Получить детальную информацию о конкретной коллекции можно при помощи метода stats(). Ниже приводится пример, использования метода stats() запрашивающего детальную информацию о коллекции articles текущей базы данных

db.articles.stats()
{
	"ns" : "test.articles",
	"count" : 3,
	"size" : 368,
	"avgObjSize" : 122.66666666666667,
	"storageSize" : 12288,
	"numExtents" : 1,
	"nindexes" : 1,
	"lastExtentSize" : 12288,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 0,
	"totalIndexSize" : 8176,
	"indexSizes" : {
		"_id_" : 8176
	},
	"ok" : 1
}

[править] Документы

[править] Вставка нового документа

Внутри текущей базы данных создаются коллекции, вставка нового документа в коллекцию при помощи метода insert приводит к её автоматическому созданию. В качестве аргумента, метод insert принимает JSON-объект, который служит телом документа. Ниже в базу данных вставляются документы с единственным ключом title, в качестве значения которого выступают названия различных СУБД.

db.mybase.insert({title: "MySQL"})
db.mybase.insert({title: "PostreSQL"})
db.mybase.insert({title: "MongoDB"})
db.mybase.insert([{title: "MS SQL"}, {title: "Oracle"}])

Формат JSON допускает создание как единичных объектов, так и массивов. Записи "MySQL", "PostreSQL" и "MongoDB" вставляются отдельными вставками, в то время как "MS SQL" и "Oracle" при помощи массива, элементы которого в JSON заключаются в квадратные скобки. Для каждого документа автоматически создается идентификатор "_id", который можно задавать вручную, с единственным условием, чтобы он оставался уникальным в рамках текущей базы данных. Идентификатор, который формируется по умолчанию, формируется по следующему алгоритму: в старших четырех байтах находится время создания записи в формате UNIXSTAMP, следующие три байта — идентификатор компьютера, следующие два — идентификатор процесса, последние три — локальный счетчик процесса.

[править] Извлечение результатов

Для того, чтобы извлечь результаты можно воспользоваться методом find

db.mybase.find()
{ "_id" : ObjectId("51eb8c2bb4d7d4d898b05fce"), "title" : "MySQL" }
{ "_id" : ObjectId("51eb905ab4d7d4d898b05fcf"), "title" : "PostreSQL" }
{ "_id" : ObjectId("51eb9061b4d7d4d898b05fd0"), "title" : "MongoDB" }
{ "_id" : ObjectId("51eb907db4d7d4d898b05fd1"), "title" : "MS SQL" }
{ "_id" : ObjectId("51eb907db4d7d4d898b05fd2"), "title" : "Oracle" }

Методы, допускают использование селекторов, например, для извлечения документа, соответствующего MySQL методу find можно передать следующий JSON-объект

db.mybase.find({"title" : "MySQL"})
{ "_id" : ObjectId("51eb9bb1303d105141c7d74b"), "title" : "MySQL" }

[править] Обновление документов

Для обновления используется метод update, первый аргумент которого определяет список обновляемых документов, второй — как отобранные документы модифицируются. Следующая команда добавляет в документ с названием "MongoDB" дополнительное поле nosql, со значением "true":

db.mybase.update({"title": "MongoDB"}, {$set: {nosql: "true"}})
db.mybase.find()
{ "_id" : ObjectId("51eb9bb1303d105141c7d74b"), "title" : "MySQL" }
{ "_id" : ObjectId("51eb9bb1303d105141c7d74c"), "title" : "PostreSQL" }
{ "_id" : ObjectId("51eb9bb2303d105141c7d74e"), "title" : "MS SQL" }
{ "_id" : ObjectId("51eb9bb2303d105141c7d74f"), "title" : "Oracle" }
{ "_id" : ObjectId("51eb9bb1303d105141c7d74d"), "nosql" : "true", "title" : "MongoDB" }

[править] Удаление документов

Полностью удалить документы из текущей базы данных можно при помощи метода remove()

db.mybase.remove()

Точно также, как и другие методы, в качестве параметра метод может принимать селекторы, например, удалить все записи с ключом nosql равным "true" можно при помощи следующей команды

db.mybase.remove({nosql: "true"})

[править] Индексирование

Создадим объемную коллекцию numbers, задействовав курсоры

for(i = 0; i < 100000; i++){
  db.numbers.insert({value: i})
}

Для того, чтобы выбрать четыре последних элемента можно воспользоваться оператором $gt (больше)

db.numbers.find({value: {$gt: 99995}})
{ "_id" : ObjectId("51ec2c9fb237b52e6c7ccd94"), "value" : 99996 }
{ "_id" : ObjectId("51ec2c9fb237b52e6c7ccd95"), "value" : 99997 }
{ "_id" : ObjectId("51ec2c9fb237b52e6c7ccd96"), "value" : 99998 }
{ "_id" : ObjectId("51ec2c9fb237b52e6c7ccd97"), "value" : 99999 }

Метод explain() возвращает JSON-структуру с планом выполнения запроса, который сообщает, что для поиска четырех документов, были просканированы все 100000 документов коллекции (nscannedObjects)

db.numbers.find({value: {$gt: 99995}}).explain()
{
	"cursor" : "BasicCursor",
	"isMultiKey" : false,
	"n" : 4,
	"nscannedObjects" : 100000,
	"nscanned" : 100000,
	"nscannedObjectsAllPlans" : 100000,
	"nscannedAllPlans" : 100000,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 1,
	"nChunkSkips" : 0,
	"millis" : 34,
	"indexBounds" : {
 
	},
	"server" : "servername:27017"
}

Чтобы ускорить процесс выборки, прибегают к созданию индекса по полю values, для чего следует выполнить метод ensureIndex(), указав название поля value.

db.numbers.ensureIndex({value: 1})

Здесь цифра 1, сообщает, что индекс следует выполнить в порядке возрастания. Убедиться, в том что индекс создан, можно при помощи метода getIndexes()

db.numbers.getIndexes()
[
	{
		"v" : 1,
		"key" : {
			"_id" : 1
		},
		"ns" : "test.numbers",
		"name" : "_id_"
	},
	{
		"v" : 1,
		"key" : {
			"value" : 1
		},
		"ns" : "test.numbers",
		"name" : "value_1"
	}
]

Метод сообщает, что в базе данных numbers имеется два индекса: для столбца _id и value. Запросив план запроса, можно убедиться, что теперь для извлечения результата из базы данных извлекается только 4 строки

db.numbers.find({value: {$gt: 99995}}).explain()
{
	"cursor" : "BtreeCursor value_1",
	"isMultiKey" : false,
	"n" : 4,
	"nscannedObjects" : 4,
	"nscanned" : 4,
	"nscannedObjectsAllPlans" : 4,
	"nscannedAllPlans" : 4,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"value" : [
			[
				99995,
				1.7976931348623157e+308
			]
		]
	},
	"server" : "servername:27017"
}

[править] Справка

Для получения справки используется метод help()

db.help()

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

db.insert.help()

Так как в качестве языка запросов используется JavaScript, можно в любой момент запросить исходный код метода. Для этого нужно опустить круглые скобки в вызове метода

db.articles.insert
function ( obj , options, _allow_dot ){
    if ( ! obj )
        throw "no object passed to insert!";
    if ( ! _allow_dot ) {
        this._validateForStorage( obj );
    }
 
    if ( typeof( options ) == "undefined" ) options = 0;
 
    if ( typeof( obj._id ) == "undefined" && ! Array.isArray( obj ) ){
        var tmp = obj; // don't want to modify input
        obj = {_id: new ObjectId()};
        for (var key in tmp){
            obj[key] = tmp[key];
        }
    }
    var startTime = (typeof(_verboseShell) === 'undefined' ||
                     !_verboseShell) ? 0 : new Date().getTime();
    this._mongo.insert( this._fullName , obj, options );
    this._lastID = obj._id;
    this._printExtraInfo("Inserted", startTime);
}

[править] Утилиты

База данных MongoDB поставляется с несколькими вспомогательными утилитами:

  • mongo — консольный клиент, позволяющий устанавливать соединение с сервером mongodb, отправлять запросы с использованием языка программирования JavaScript и JSON-структур;
  • mongodump — утилита создания резервной копии базы данных, сохраняет базу данных в бинарном формате BSON;
  • mongorestore — утилита позволяющая восстановить базу данных из резервной копии в формате BSON, полученной ранее при помощи утилиты mongodump;
  • mongoexport — утилита создания резервной копии данных в форматах JSON, CSV и TSV;
  • mongoimport — утилита импортирует данные из файлов в форматах JSON в базу данных MongoDB;
  • mongostat — монитор нагрузки сервера MongoDB, отображает статистику по количеству операций в секунду, соединений и объему выделенной памяти;

[править] Создание резервной копии

Для создания резервной копии в бинарном формате BSON удобно воспользоваться утилитой mongodump

mongodump

Выполненная без параметров, утилита создает резервную копию всех баз данных, складируя их в подкаталог dump текущего каталога. Внутри каталога dump для каждой базы данных создается подкаталог, в котором для каждой коллекции создается два файла, один, с расширением .bson, с содержимым коллекции в BSON-формате, другой, с расширением .metadata.json — метаинформацию о коллекции в JSON-формате: индексы и пространство имен.

Название каталога dump можно изменить, воспользовавшись параметром -o или его расширенной версией --out, команда представленная ниже сохранит резервную копию в каталоге с названием restore

mongodump --out restore

Для того, чтобы создать резервную копию лишь одной базы данных можно воспользоваться параметром -d или его расширенной версией --db, за которой следует указать имя сохраняемой базы данных

mongodump --db articles

В этом случае каталог с резервной копией dump будет содержать лишь одну базу данных articles. Для того чтобы ограничить резервную копию одной коллекцией, можно воспользоваться параметром -c или его расширенной версией --collection

mongodump --db articles --collection mybase

Для восстановления базы данных из BSON-формата предназначена утилита mongorestore, которая по умолчанию ищет в текущем каталоге подкаталог dump и пытается восстановить базы данных и коллекции из BSON-копий, которые удается обнаружить.

mongorestore

Поведение утилиты mongorestore можно настроить, воспользовавшись теми же самыми ключами, что и в случае утилиты mongodump. В частности, параметр -o или --out позволяет указать путь к каталогу, отличному от dump. Параметр -d или --db позволяет ограничить восстановление одной базой данных. Параметр -c или --collection ограничивает восстановление одной коллекцией.

Бинарный формат BSON, экономичнее и быстрее текстового формата JSON. Однако, JSON получил широкое распространение, именно благодаря тому, что понятен человеку и может быть легко прочитан из множества программных сред. Для получения резервной копии в JSON формате удобно воспользоваться утилитой mongoexport. В отличие от mongodump и mongorestore утилита mongoexport не работает сразу со всеми базами данных и для извлечения резервной копии ей необходимо указать базу данных (-d или --db), коллекцию (-c или --collection) и список извлекаемых полей через запятую (-f или --fields).

mongoexport -d articles -c mybase -f _id,title

Поле _id указывать не обязательно, оно добавляется в результат автоматически. По умолчанию утилита выводит результаты в JSON-формате, который помещает в стандартный вывод (то есть результат выводится в консоль). Для сохранения результата можно воспользоваться перенаправлением в файл

mongoexport -d articles -c mybase -f _id,title > result.json

или указать результирующий файл при помощи параметра -o или --out

mongoexport -d articles -c mybase -f _id,title -o result.json

По умолчанию утилита mongoexport сохраняет результат в JSON формате, можно потребовать сохранить результат в CSV-фортмате, воспользовавшись параметром --csv

mongoexport --csv -d articles -c mybase -f _id,title -o text.csv

Для заполнения коллекций данными из JSON-файла предназначена утилита mongoimport

mongoimport -d articles -c mybase -f title < result.json

При помощи параметров -d, и -f следует уточнить имя базы данных, коллекции и список импортируемых полей. Утилита ожидает JSON-данные по стандартному каналу ввода, на который можно перенаправить файл при помощи последовательности <.

[править] Мониторинг нагрузки

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

mongostat

Периодичность можно изменять, передавая в качестве параметра интервал в секундах, через которое утилита будет опрашивать сервер. Команда ниже опрашивает сервер раз в пять секунд

mongostat 5

По умолчанию утилита опрашивает сервер до тех пор, пока её работа не будет прервана комбинацией клавиш Ctrl+C, однако количество опросов можно задать явно при помощи параметра -n или его расширенной версии --rowcount. Команда, представленная ниже опрашивает сервер через каждые 2 секунды 10 раз, после чего прекращает свою

mongostat -n 2 10

Утилита mongostat выводит результат в виде таблицы, со следующими столбцами

  • insert — количество операций вставок в секунду;
  • query — количество запросов на выборку в секунду;
  • update — количество операций обновлений в секунду;
  • delete — количество операций удалений в секунду;
  • getmore — количество операций получения следующей страницы в наборе в секунду (операция it при извлечении объемного результата);
  • command — общее количество команд, в репликационных схемах это значение представлено двумя числами разделенных вертикальной четой, первое число — количество локальных операций, второе — количество команд выполненных в рамках репликации;
  • flushes — количество операций сброса информации из оперативной памяти на диск в секунду;
  • mapped — количество данных баз данных в мегабайтах спроецированных в оперативную память;
  • vsize — объем виртуальной памяти в мегабайтах, используемых сервером;
  • res — объем физической памяти в мегабайтах, используемой сервером;
  • faults — количество страничных отказов, неудачных обращений к спроецированной в оперативную память области, повлекший загрузку страницы с жесткого диска;
  • locked db — процент времени, который сервер проводит в состоянии глобальной блокировки (окончания которой ожидают другие потоки на запись);
  • idx miss % — процент неудачных обращений к индексу;
  • qr|qw — длина очереди клиентов ожидающих операции чтения (qr) и записи (qw) текущего сервера;
  • ar|aw — количество активных клиентов выполняющих операции чтения (ar) и записи (aw);
  • netIn — количество входящего сетевого трафика в байтах текущего сервера;
  • netOut — количество исходящего сетевого трафика в байтах текущего сервера;
  • conn — общее количество открытых соединений;
  • time — время съема статистический данных;

[править] Программирование

[править] Ruby

Для работы с Ruby необходимо установить gem-пакет mongo при помощи следующей команды

gem install mongo

Для того, чтобы воспользоваться бинарным форматом BSON следует установить gem-пакет bson_ext

gem install bson_ext

Оба gem-пакета можно добавить в Gemfile-файл проекта, в результате чего они будут установлены автоматически во время обновления гем-пакетов командой bundle.

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

# encode: utf-8
require 'mongo'
 
con = Mongo::Connection.new
articles = con['articles']
puts articles.inspect

Для того, чтобы в программе можно было использоваться русские символы, в первой строке скрипта размещается специальный комментарий с ключевым словом encode: после которого следует название кодировки utf-8. Метод inspect является традиционным методом мониторинга состояния объекта.

Приведенный выше пример можно сохранить в файле mongodb.rb, для выполнения программы следует передать интерпретатору ruby путь к файлу.

ruby mongo.rb

[править] PHP

Для установки расширения для работы с MongoDB в Ubuntu следует выполнить следующую команду

sudo pecl install mongo

В файле php.ini необходимо прописать расширение mongo.so

extension=mongo.so

При выборе файла php.ini следует ориентироваться на используемый в текущей конфигурации файл. Если PHP установлен в качестве модуля Apache, то конфигурационный файл следует искать по пути /etc/php5/apache2/php.ini, если PHP установлен в качестве внешнего сервиса, например php-fpm (например, при совместном использовании с Web-сервером nginx), то файл php.ini следует искать по пути /etc/php5/fpm/php.ini. Если PHP установлен в качестве модуля Web-сервера Apache, его следует перезагрузить при помощи следующей команды

sudo service apache2 restart

В случае, если используется php-fpm, требуется перезагрузить сервис php5-fpm

sudo service php5-fpm restart

Проверить успешность установки расширения можно, обратившись к функции phpinfo()

<?php
  phpinfo();
?>

В случае успешной установки, в отчете функции появится раздел, посвященный MongoDB

Отчет функции phpinfo(), после успешной установки расширения для работы с MongoDB

В следующей программе, извлекается содержимое коллекции articles базы данных mybase

<?php
  $m = new Mongo("mongodb://localhost");
  $coll = $m->mybase->articles;
  $cursor = $coll->find();
  echo "<pre>";
  while($line = $cursor->getNext()){
    print_r($line);
  }
  echo "</pre>";
?>

Результат выполнения программы, может выглядеть следующим образом

Array
(
    [_id] => MongoId Object
        (
            [$id] => 51ec1d8db237b52e6c7839b5
        )
 
    [title] => MongoDB
    [tags] => Array
        (
            [0] => NoSQL
            [1] => MongoDB
        )
)
Array
(
    [_id] => MongoId Object
        (
            [$id] => 51ec1d8db237b52e6c7839b4
        )
    [tags] => Array
        (
            [0] => NoSQL
            [1] => MongoDB
            [2] => memcached
            [3] => CouchDB
            [4] => Riak
            [5] => HBase
            [6] => Redis
            [7] => Обзор
        )
    [title] => Обзор NoSQL решений
)
Array
(
    [_id] => MongoId Object
        (
            [$id] => 51ec1d8eb237b52e6c7839b6
        )
 
    [tags] => Array
        (
            [0] => NoSQL
            [1] => Redis
            [2] => Обзор
        )
    [title] => Redis
)

[править] См. также

[править] Литература

  • Кайл Бэнкер MongoDB в действии = MongoDB in Action. — М.: ДМК Пресс, 2012. — 394 с. — ISBN 978-5-94074-831-1
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты