Основи MongoDB

8 хв. читання

В цьому гайді ми познайомимось з MongoDB, документно-орієнтованою NoSQL-БД з відкритими сирцями. Я покажу як її встановити та використовувати базові команди. Також ми напишемо невеличкий додаток на Node.js, використовуючи драйвер mongodb.

MongoDB

MongoDB це крос-платформна, потужна, гнучка, документно-орієнтована база даних, що легко масштабується. Вона також має вбудовану підтримку MapReduce-style Aggregation та Geospatial індексів.

MongoDB складається з баз даних, які зберігають в собі колекції. Кожна колекція складається з документів, які в свою чергу складаються з полів. Поля є парами ключ-значення. Колекції також можуть бути індексовані, що покращує швидкість вибірки та сортування.

Невеличке порівняння SQL з MongoDB

Основи 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

Основи MongoDB

1. Створення та видалення БД

Для зміни поточної БД а також для створення нової використовують команду use Database_Name.

Основи MongoDB

Команда 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 дозволяє отримати всі документи:

Основи MongoDB

На цьому наш туторіал закінчується, сподіваюсь він стане початком вашого шляху в світ NoSQL.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація