Перейти к содержанию

MongoDB

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

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

Для работы с MongoDB и Node.js имеется специальный официальный драйвер, который устанавливается через npm.

npm install mongodb --save

Подключение

Теперь подключимся к базе.

connection.js

const mongo = require('mongodb').MongoClient

mongo.connect('mongodb://localhost:27017', (err, client) => {
  if (err) {
    console.log('Connection error: ', err)
    throw err
  }

  console.log('Connected')

  client.close()
})

Подключение осуществляется с помощью метода connect() экземпляра MongoClient, который принимает URL, по которому доступна MongoDB (по умолчанию http://127.0.0.1:27017), и callback-функцию, которой передается два параметра:

  • ошибка подключения (null, если подключение прошло успешно);
  • экземпляр объекта подключения к MongoDB, через API которого создаются новые БД и осуществляется доступ к уже существующим.

После окончания работы с сервером MongoDB не забывайте закрывать соединение с сервером базы данных.

client.close()

Создание базы данных

Для создания/подключения к базе данных используется метод db() экземпляра объекта подключения, который принимает название БД и возвращает объект для выполнения . Если указанная база не существует, то она будет создана.

const db = client.db('db_name')

Физически база данных начинает свое существование только после создания в ней хотя бы одной коллекции (тоже самое, что и таблица в SQL).

Коллекции

Коллекции создаются вызовом метода createCollection(), принимающего название коллекции и callback-функцию с ошибкой и результатом в качестве параметров.

const db = client.db('db_name')
const users = db.createCollection('users')

Для удаления коллекции используйте применительно к ней метод drop(), который в качестве аргумента принимает callback-функцию с двумя параметрами:

  • ошибка (если удаление прошло успешно - null);
  • объект с успешным результатом.
users.drop((err, result) => {
  if (err) {
    console.log('Unable drop collection: ', err)
    throw err
  }
})

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

Создание записи

Теперь создадим в коллекции users первую запись.

users.insertOne({ id: 1, login: 'login1', name: 'name1', gender: 'male' }, (err, result) => {
  if (err) {
    console.log('Unable insert user: ', err)
    throw err
  }
})

Чтобы вставить сразу несколько записей имеется метод insertMany().

users.insertMany([{ id: 2, login: 'login2', name: 'name2', gender: 'male' }, { id: 3, login: 'login3', name: 'name3', gender: 'female' }], (err, result) => {
  if (err) {
    console.log('Unable insert user: ', err)
    throw err
  }
})

Получение записи

Для получения всех записей в коллекции используйте метод find() экземпляра коллекции.

users.find()

Методу find() в качестве параметра можно передать объект, выполняющий роль фильтра для извлекаемых записей. Например, в следующем примере возвращаются все записи, у которых поле gender равно male.

users.find({ gender: 'male' })

Чтобы получить только первую запись выборки, используйте метод findOne().

users.findOne()
users.findOne({ gender: 'male' })

Для получения n-первых записей имеется метод limit(), принимающий количество возвращаемых записей.

users.find().limit(5)

Сортировка полученного результата осуществляется с помощью метода sort(), который принимает объект, в котором ключ - сортирующее поле, а значение - порядок сортировки (1 - по возрастанию, а -1 - по убыванию).

users.find().sort(1)

Ограничение по выборке и сортировку можно задать в объекте, передаваемом вторым необязательным параметром.

users.find(
  {},
  {
    limit: 5,
    sort: 1
  }
)

С полным списком параметров можно ознакомиться в официальной документации.

Объединение коллекций

Ранее уже упоминалось, что в MongoDB отсутствуют реляционность, тем не менее в ней возможно объединений коллекций по принципу LEFT JOIN в SQL с помощью метода aggregate().

users
  .aggregate([
    {
      $lookup: {
        from: 'rooms',
        localField: 'room_id',
        foreignField: 'id',
        as: 'room_details'
      }
    }
  ])
  .toArray((err, res) => {
    if (err) {
      console.log('Aggregate error: ', err)
      throw err
    }

    console.log(res)
  })

Метод aggregate() принимает массив с описанием объединений с другими коллекциями. Объединение определяется объектом с ключом $lookup, значением для которого служит объект конфигурации со следующими свойствами:

  • from - название коллекции, с которой происходит слияние;
  • localField - наименование поля, по которому будет осуществляться объединение с внешней коллекцией;
  • foreignField - наименование объединяющего поля из внешней коллекции;
  • as - название поля в текущей коллекции, которое будет содержать данные, полученные в результате слияния.

Обновление записи

Обновление записи происходит с помощью метода updateOne(), который принимает условие для записей, которые необходимо обновить, и объект со свойством $set, в значении которого указываются, какие именно поля нужно изменить.

users.updateOne({ id: 1 }, { $set: { gender: 'female' } }, (err, result) => {
  if (err) {
    console.log('Unable update user: ', err)
    throw err
  }
})

Удаление записи

За удаление записей отвечают методы deleteOne() и deleteMany().

users.deleteOne({ id: 3 }, (err, result) => {
  if (err) {
    console.log('Unable delete user: ', err)
    throw err
  }
})

Более подробную информацию о возможностях драйвера для Node.js MongoDB можно получить на официальном сайте.