Работа с базами данных. Часть I

Цель

Освоить приципы взаимодействия node.js и баз данных. Научиться выполняль простые операции по выборке данных и манипуляции данными.

Предварительные требования

Элементарные занния о реляционных и документных базах данных.

Основы MongoDB

MongoDB (от англ. humongous — огромный) —документоориентированнаясистема управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц. MongoDB классифицирована как NoSQL. Она использует JSON-подобные документы и схему базы данных.

Запись в MongoDB это документ, структура данных, составленная из пар field: value (поле: значение). Документы MongoDB похожи на объекты JSON. Значения полей могут включать другие документы, массивы и массивы документов. Документы хронятся в коллекциях.

Преимущество использования документов:

  • Документы (иначе говоря объекты) соответствуют родным типам данных во многих языках программирования
  • Встроенные документы и массивы понижают необходимость тяжелых объединений данных
  • Динамическая схема поддерживает свободный полиморфизм

Операции создания

Создание или вставка документов добавляет новые документы (documents) в коллекцию (collection). Если коллекция в данный момент не существует, операция вставки создаст ее.

MongoDB предоставляет следующие методы для вставки документов:

В MongoDB операция вставки осуществляется в одну коллекцию. Все операции записи в MongoDB атомарны (atomic) на уровне одного документа.

Операции чтения

Операции чтения получают документы из коллекций, иначе говоря запрашивают коллекции для получения документов. MongoDB предоставляет следующий метод для чтения документов:

Можно определить фильтры (query filters or criteria) определяющие возвращаемый документ.

Операции обновления

Операции обновления изменяют существующий документ в коллекции. MongoDB предоставляет следующие методы для обновления документов

В MongoDB операции обновления затрагивают одну коллекцию.

Можно задать критерии или фильтры для идентификации обновляемых документов. Фильтры имеют такой же синтаксис, как и для чтения документов.

Операции удаления

Операции удаления, как ни странно, удаляют документ из коллекции. MongoDB предоставляет следующие методы для удаления документов из коллекции:

В MongoDB операции удаления затрагивают одну коллекцию.

Можно задать критерии или фильтры для идентификации удаляемых документов. Фильтры имеют такой же синтаксис, как и для чтения документов.

Взаимодействие с Node.js

MongoDB взаимодействует Node.js с помощью так называемого драйвера. По сути это модуль, позволяющий содиниться с базой данных, передавать на нее команды и получать данные. Установить модуль можно с помощью npm:

npm install mongodb --save

Следующий пример показывает использование драйвера для создания и поиска документов:

const MongoClient = require('mongodb').MongoClient;

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'myproject';

const insertDocuments = function(db, callback) {
  // Get the documents collection
  const collection = db.collection('documents');
  // Insert some documents
  collection.insertMany([
    {a : 1}, {a : 2}, {a : 3}
  ], function(err, result) {
    console.log("Inserted 3 documents into the collection");
    callback(result);
  });
}

const findDocuments = function(db, callback) {
  // Get the documents collection
  const collection = db.collection('documents');
  // Find some documents
  collection.find({}).toArray(function(err, docs) {
    console.log("Found the following records");
    console.log(docs)
    callback(docs);
  });
}

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  insertDocuments(db, function() {
    findDocuments(db, function() {
      client.close();
    });
  });
});

Подробнее о работе драйвера см. документацию

Основы работы с Mongoose

Прямая работа с данными MongoDB через драйвер представляется сложной для описания реальной бизнес-логики, поэтому существуют различные обертки, позволяющие приложению элегантно взаимодействовать с базой данных. Одна из таких оберток - модуль Mongoose.

Mongoose - библиотека для работы node.js приложения с базой данных MongoDB. Он обеспечивает краткое, основанное на схемах решение для моделирования данных приложений. Mongoose включает встроенное отражение типов данных, валидацию, построение запросов, привязку бизнес-логики и многое другое.

Установка:

$ npm install mongoose

Включение в проект и соединение с базой данных с testна локальном экземпляре MongoDB.

// getting-started.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

Установка обработчиков успешного соединения с базой данных или ошибки:

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  // we're connected!
});

Колбэк будет вызван как только соединение будет установлено. В Mongoose всё происходит от Схемы (Schema). Можно взять ссылку на схему и определить свою схему.

var kittySchema = mongoose.Schema({
  name: String
});

Мы получили схему с одним свойством name типа String. Следующий шаг - скомпилировать схему в модель (Model).

var Kitten = mongoose.model('Kitten', kittySchema);

Модель это класс с помощью которого мы конструируем документы. В нашем случае каждй документ будет Kitten со свойствами и поведением задекларированными в схеме. Создадим документ:

var silence = new Kitten({ name: 'Silence' });
console.log(silence.name); // 'Silence'

Добавим функциональность speak в наш документ:

// Метод должен быть добавлен в схему перед ее компиляцией в mongoose.model()
kittySchema.methods.speak = function () {
  var greeting = this.name
    ? "Meow name is " + this.name
    : "I don't have a name";
  console.log(greeting);
}

var Kitten = mongoose.model('Kitten', kittySchema); kittySchema);

Функции, добавленные в свойство methods property компилируются в прототип модели и становятся доступны в каждом экземпляре - документе.

var fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak(); // "Meow name is fluffy"

Сохраним созданные документы в MongoDB. Каждый документ может быть добавлен в базу данных с помощью его метода save. Первый аргумент колбэка при этом - ошибка, в случае её возникновения.

  fluffy.save(function (err, fluffy) {
    if (err) return console.error(err);
    fluffy.speak();
  });

Получить доступ к сохраненным документам через модель:

Kitten.find(function (err, kittens) {
  if (err) return console.error(err);
  console.log(kittens);
})

Так мы вывели все модели в консоль. Если мы хотим отфильтровать документы, Mongoose поддерживает синтаксис запросов MongoDB (querying) .

Kitten.find({ name: /^fluff/ }, callback);

Практическое задание

  1. Установить локальный экземпляр MongoDB
  2. Создать коллекцию для хранения информации о постах и коментариях блога. Документы коментариев должны быть в свойстве поста - массиве документов.
  3. Написать скрипт для создания, чтения, обновления и удаления постов и коментариев.
  4. Сделать рефакторинг скрипта используя Mongoose

Глоссарий

Термин Значение
CRUD Create + Read + Update + Delete: объединенное понятия для элементарных операций с данными в базе данных.
Документная база данных база данныхбаза данных, специально предназначенная для хранения иерархических структур данных (документов) и обычно реализуемая с помощью подхода NoSQL
Реляционная база данных база данных, основанная на реляционной модели данных. Понятие «реляционный» основано на англ. relation («отношение», «зависимость», «связь»).
NoSQL термин, обозначающий ряд подходов, направленных на реализацию хранилищ баз данных, имеющих существенные отличия от моделей, используемых в традиционных реляционных СУБД с доступом к данным средствами языка SQL.

Ссылки

  1. http://www.bazhukov.net/little-mongodb-book/ - Краткий курс по MongoDB на русском языке
  2. http://mongoosejs.com/docs/guide.html - Официальная документация по Mongoose
  3. https://docs.mongodb.com/manual/- Официальное руководство по MongoDB

results matching ""

    No results matching ""