В цьому гайді ми познайомимось з MongoDB, документно-орієнтованою NoSQL-БД з відкритими сирцями. Я покажу як її встановити та використовувати базові команди. Також ми напишемо невеличкий додаток на Node.js, використовуючи драйвер mongodb
.
MongoDB
MongoDB це крос-платформна, потужна, гнучка, документно-орієнтована база даних, що легко масштабується. Вона також має вбудовану підтримку MapReduce-style Aggregation та Geospatial індексів.
MongoDB складається з баз даних, які зберігають в собі колекції. Кожна колекція складається з документів, які в свою чергу складаються з полів. Поля є парами ключ-значення. Колекції також можуть бути індексовані, що покращує швидкість вибірки та сортування.
Невеличке порівняння SQL з MongoDB
Також слід зауважити, що деякі фічі реляційних БД не підтримуються в Mongo. Наприклад, Join'и та комплексні транзакції. Відмова від них спричинена специфікою платформи, тому що обидва з ним сильно заважають масштабуванню.
Але, дивлячись на останні новини, join'и додадуть в версії 3.2 в вигляді нового оператора $lookup
Встановлення
В цьому гайді ми будемо встановлювати MongoDB на Ubuntu. Але БД працює на багатьох платформах.
Примітка перекладача: якщо ви досі використовуєте 32-х бітні системи (як я), то така інсталяція для вас не підійде, так як Mongo має обмеження для 32-х бітних систем і взагалі скоро стане для них недоступною. Ось так її встановлював я.
Покроково
Імпортуйте публічний ключ, що використовується системою управління пакетами
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
Створіть файл з джерелом MongoDB
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
Оновіть репозитарії
sudo apt-get update
Встановіть MongoDB
sudo apt-get install -y mongodb-org
Запустіть MongoDB-демон
sudo service mongod start
Mongo зберігає всі файли в теці /var/lib/mongodb
, а логи в /var/log/mongodb
та запускається від імені користувача mongodb
. Але все це ви можете змінити в конфігу, що лежить в /etc/mongod.conf
.
Базові операції
Mongo-шелл — це інтерактивна JavaScript оболонка до MongoDB. Ви можете використовувати її для створення та зміни даних а також і для адміністрування.
Після старту mongo ви можете до нього підключитися по порту 27017. Відкрити інтерактивну оболонку можна командою $ mongo
1. Створення та видалення БД
Для зміни поточної БД а також для створення нової використовують команду use Database_Name
.
Команда db
виводить поточну БД, а show dbs
всі існуючі.
Видалити БД можна командою db.dropDatabase()
{ "dropped" : "local", "ok" : 1 }
2. Створення та видалення колекцій
Створення колекцій відбувається так:
db.createCollection(name, options)
Тут name
- ім'я для колекції, а options
(не обов'язковий параметр) зберігає опції індексації та ліміту пам'яті.
Видалення колекцій:
db.COLLECTION_NAME.drop()
3. CRUD операції
1. Створення документів
Методи insert()
та save()
дозволяють додавати нові документи в колекцію. Також, якщо викликати вставку на неіснуючій колекції, то вона буде створена і в неї буде додано цей документ.
db.employees.insert({
"employee_id":1,
"name":"employee1"
});
WriteResult({ "nInserted" : 1 })
Тут employees
це колекція, що зберігає об'єкти employee
.
2. Пошук документів
Щоб знайти потрібний документ слід виконати метод find()
. Також можна опціонально додати виклик методу pretty()
, що зробить вивід красивішим.
> db.employees.find().pretty()
{
"_id" : ObjectId("579c657b56c7d42812e2788c"),
"employeeid" : 1,
"name" : "sanju"
}
{
"_id" : ObjectId("579c67e9b87b4b49be12664b"),
"name" : "employee1",
"employee_id" : 2
}
Зверніть увагу на поле _id
— це дванадцятибітне число в шістнадцятковій системі, воно унікальне для кожного документа.
3. Оновлення записів
В mongo є два методи для оновлення документів: update()
та save()
. в той час як update()
оновлює існуючий запис, save()
його заміняє.
'Update' syntax : db.collection.update(<query>,<update>)
db.employees.update({"employee_id":2},{"name":"Employee2"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.employees.save({"employee_id":1,"name":"Sanjeev"})
WriteResult({ "nInserted" : 1 })
db.employees.find()
{ "_id" : ObjectId("579c6efbb87b4b49be12664d"), "employee_id" : 1, "name" : "Sanjeev" }
4. Видалення документа
Для видалення використовується метод remove()
. Він приймає два параметра: критерій для вибірки, що буде видалена та прапор justOne
(видалити лише перший збіг з вибірки).
db.employees.remove({"_id":ObjectId("579c6ecab87b4b49be12664c")})
WriteResult({ "nRemoved" : 1 })
Виконання базових операцій через API для NodeJS
Ми розглянули як взаємодіяти з Mongo, використовуючи оболонку. Настав час зробити NodeJS API для взаємодії з БД прямо з вашого додатку.
API дасть можливість виконувати базові CRUD-операції на колекції employees
в базі corporate
.
Наш стек технологій: Node.js + ExpressJS + MongoDB
Структура директорій:
.
|-- business
| `-- employeeDAO.js
|-- config
| `-- config.js
|-- db
| `-- db.js
|-- package.json
|-- README.md
|-- routes
| `-- routes.js `
-- server.js
config : деталі для підключення до БД
routes : оголошення шляхів для нашого API
business : бізнес логіка самих операцій
server.js : вхідна точка для нашого додатку
API
- { URI:
\\employee
, Метод:GET
} отримати всі документи - { URI:
\\employee\\:id
, Метод:GET
} отримати документи за id - { URI:
\\employee
, Метод:POST
} створити новий документ - { URI:
\\employee\\:id
, Метод:POST
} оновити існуючий документ
Конфіг
Конфіг - об'єкт javascript, що зберігає в собі ім'я БД, ім'я користувача, пароль (якщо ввімкнена аутентифікація) та порт.
dev: {
rootPath:rootPath,
db:'mongodb://localhost:27017/corporate',
port:process.env.PORT || 3030,
uname:'*',
password:'*'
}
Старт додатку
Давайте сконфігуруємо наш додаток в файлі server.js
Server.js
//Імпорт конфігу
var config=require('./config/config.js')['dev'];
//Імпорт об'єкту БД
var db = require('./db/db.js');
//Використання Express routes
require('./routes/routes.js')(app,config);
var app=express();
app.use(cookieparser());
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
//Виклик методу connect() для встановлення з'єднання з MongoDB in
db.connect(config.db, function(err) {
if(err){
console.log("Error");
process.exit(1);
}else{
console.log("db connection estlablished !!");
app.listen(config.port, function() {
console.log("App runnin on port : "+config.port);
});
}
});
Об'єкт БД
Цей об'єкт використовується для роботи з БД
db.js
// імпортуємо монго-клієнт з драйверу
var MongoClient = require('mongodb').MongoClient
//змінна для збереження стану з'єднання
var state = {
db: null,
}
// Функція обробки з'єднань
exports.connect = function(url, done) {
if (state.db) return done()
MongoClient.connect(url, function(err, db) {
if (err) return done(err)
state.db = db
done()
})
}
//отримання кешованого об'єкту БД
exports.get = function() {
return state.db
}
//Функція закриття з'єднання
exports.close = function(done) {
if (state.db) {
state.db.close(function(err, result) {
state.db = null
state.mode = null
done(err)
})
}
}
Express Routes
Тут ми опишемо шляхи для нашого API. Повний код знаходиться тут.
routes.js
//Об'єкт з бізнес-логікою
var employeeDAO=require('../business/employeeDAO.js');
//Express route що викликає отримання всіх документів
app.get('/employee',function(req,res){
employeeDAO.getAllEmployees(function(err,response){
if(err){
res.end(err);
}else{
res.status(200);
res.json(response);
res.end();
}
});
});
Логіка доступу до даних
Тут представлена логіка базових операцій з БД
employeeDAO.js
//імпорт об'єкту БД
var db = require('../db/db.js')
//Експорт об'єкту бізнес-логіки
module.exports={
getAllEmployees : function(callback){
//отримання БД і вказанні імені колекції
var collection = db.get().collection('employees');
//отримання всіх документів
collection.find().toArray(function(err, result) {
if(err){
callback(err,null);
}else{
callback(null,result);
}
});
}
}
Тестування нашого API
На скріншоті показано як наш API дозволяє отримати всі документи:
На цьому наш туторіал закінчується, сподіваюсь він стане початком вашого шляху в світ NoSQL.
Ще немає коментарів