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 можно получить на официальном сайте.