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