Первым делом необходимо создать подключение к репозиторию MongoDB в ОС. можно, конечно, просто найти и скачать пакет — но это менее удобный путь. Менее удобный, потому как пакеты в Unix-подобных системах зачастую тянут за собой стек зависимостей и, если из подключенного репозитория их можно установить (В стандартных могут не быть, да и во всяких epel тоже. А могут быть несовместимые.), то пакет просто ругнется на отсутствующие зависимости и отправит нас их искать по интернету. В общем, это было лирическое отступление.
В своих проектах я стараюсь использовать новые ОС корпоративного уровня, как то больше в душу лег CentOS. Подключение репозитория выглядит так:
Создаем файл
1 |
vi /etc/yum.repos.d/mongodb-org.repo |
с содержимым:
1 2 3 4 5 6 7 |
[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc |
Не сложно догадаться что сходив по ссылке: https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.4/x86_64/RPMS/
можно вытянуть нужные пакеты. А чтобы выключить репозиторий, нужно поменять enabled на 0.
Вот и все, репозиторий подключен. Устанавливаем MongoDB и зависимости
1 |
yum install mongodb-org |
Запускаем сервер баз данных
1 |
systemctl start mongod |
и добавляем его в автозагрузку
1 |
systemctl enable mongod |
. Исключительно меня порадовало то, что не понадобилось писать сервис|unit для обслуживания процесса MongoDB через systemd.
Т.к. mongodb у нас для тестов в основном и вообще не торчит в интернет, то с безопасностью ее разбираться пока не будем. Разрешим соединения с любого ip-адреса, для чего закомментируем в
1 |
/etc/mongod.conf |
строчку
1 |
# bindIp: 0.0.0.0 |
, где # — комментарий собственно.
Перезапустим сервер баз данных
1 |
systemctl restart mongod |
.
В консоли или через ssh подключимся к mongodb командой
1 |
mongo |
.
Выберем административную базу
1 |
use admin |
.
Добавим пользователя с полными правами
1 |
db.createUser({user:"*****", pwd:"****", roles:[{role:"root", db:"admin"}]}) |
.
Выйдем из mongodb
1 |
exit |
и на всякий случай перезапустим сервер
1 |
systemctl restart mongod |
.
Проверим подключение с пользователем и паролем
1 |
mongo -u '****' admin –p |
.
Если все нормально, можно подключаться GUI-клиентом для удобства.
Краткий мануал по работе с пользователями:
создать пользователя с правами чтение-запись
db.createUser( { user: "username", pwd: "passwd", roles: [ { role: "readWrite", db: "database" } ] } )
удалить пользователя
db.dropUser("username")
поменять пароль пользователю
db.changeUserPassword("username", "passwd")
дать права владельца на базу database пользователю
db.grantRolesToUser( "user", [ { role: "dbOwner", db: "database" } ] )
по аналогии убрать права пользователю
db.revokeRolesFromUser( "user", [ { role: "dbOwner", db: "database" } ] )
посмотреть права пользователя в текущей базе (смена базы командой use database)
db.getUser("username")
посмотреть всех пользователей текущей базы
db.getUsers()
*для бэкапа базы данных нужна соответствующая роль
db.grantRolesToUser( "root", [ { role: "backup", db: "admin" } ] )
Краткий мануал по командам:
создать коллекцию(базу)
db.createCollection('testDb');
добавить объект в коллекцию
db.testDb.insert({first: 'c', last: '3',});
получить содержимое коллекции
db.testDb.find();
получить содержимое коллекции, удовлетворяющее фильтру
db.testDb.find({first: 'a'});
отобрать первые два объекта коллекции, удовлетворяющих фильтру
db.testDb.find({first: 'a'}).limit(2);
отобрать объекты коллекции, удовлетворяющие фильтру, пропустив первые два
db.testDb.find({first: 'a'}).skip(2);
Не забываем, что mongodb это по сути javascript, соответственно можно комбинировать и вычислять прямо в запросе.
пример сложного запроса с выбором
1 |
first: 'a' |
и (
1 |
last: '1' |
или
1 |
last: '3' |
)
db.testDb.find({first: 'a', $or: [{last: '1'}, {last: '3'}]});
изменение объекта в коллекции
db.testDb.update({first: 'a', last: '2'}, {$set: {last: '3'}});
удаление объекта
db.testDb.remove({first: 'a'});
объект в базе по сути представляет из себя аналог json, соответственно в его полях могут храниться массивы, функции и т.д.
Сборка драйвера для php (MongoDB), сервер с ubuntu 14.04 на борту:
клонируем проект с github
1 |
git clone https://github.com/mongodb/mongo-php-driver.git |
если не установлен git, то предварительно устанавливаем его
1 |
apt-get install git |
заходим в папку со скаченным проектом
1 |
cd mongo-php-driver/ |
обновляем модули
1 |
git submodule update –init |
собираем драйвер из проекта
1 |
phpize > /dev/null && \./configure --enable-developer-flags > /dev/null && \make clean > /dev/null && make all > /dev/null && make install |
если что-то потребовало, устанавливаем через apt-get, у меня, например, затребовало пакет php56-devel
Собирать из исходников пришлось на боевом сервере, все никак руки не дойдут его перенести. А вот на CentOS 7.4 (версия php 7.0 для разнообразия) все проще:
1 |
yum install php70u-pecl-mongodb |
.
Добавляем в php.ini наш модуль:
1 |
extension=mongodb.so |