MongoDB
Теория
MongoDB - это документоориентированная БД, которая работает с JSON форматом представления данных База данных состоит из коллекций. Коллекции хранят документы. Документы же хранятся в JSON-подобном формате. Документы в одной коллекции необязательно должны иметь одинаковую структуру
Что представляет из себя Mongo DB?
Коннектимся к БД
И тут мы можем увидеть все наши БД
И, конечно, нужно избегать графического интерфейса и работать только в терминале
И первым делом отобразим список имеющихся у нас БД
show databases
// или
show dbs
Создание удаление использование баз данных
Оператор use определит какую сущность мы будем использовать. Если её нет, то эта сущность будет создана
use mongo // создаст таблицу mongo
db.createCollection(“имя_коллекции”) - создаст новую коллекцию внутри активной БД
db.createCollection("users") // создаст коллекцию users в сущности mongo
Увидеть изменения мы сможем только после обновления БД
И вот мы видим созданную коллекцию
Отобразит все коллекции внутри активной БД
show collection
Удалит базу данных
db.dropDatabase()
insert - Добавление документа в коллекцию
insert - устаревший метод, который позволяет добавлять новые объекты в базу. В примере инсертится новый документ в коллекцию users
db.users.insert({
name: "Valery",
age: 19
})
Однако мы можем увидеть такую ошибку, которая говорит нам, что insert использовать не стоит - этот метод нежелателен для использования
'DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
Добавим ещё несколько записей в документ
db.users.insertMany([
{ name: "Valery", age: 19},
{ name: "Rita", age: 24},
{ name: "Galina", age: 34},
{ name: "Varya", age: 32},
{ name: "Masya", age: 25}
])
В ответ получим, что к 5и сущностям у нас добавлены ещё и id
find - Поиск документов в коллекции
Метод find выведет весь документ в коллекции users
db.users.find()
find - Поиск по критериям
Так же в метод find мы можем вписать критерии поиска, а именно вложить объект с нужными нам свойствами и получить объекты с такими же свойствами:
db.users.find({age: 25, name: 'Masya'})
{
_id: ObjectId("6324b047183b76a3589dcc11"),
name: 'Masya',
age: 25
}
Свойств может быть сколько угодно
db.users.find({age: 19})
{
_id: ObjectId("6324aec2183b76a3589dcc0c"),
name: 'Valery', age: 19
}
{
_id: ObjectId("6324b047183b76a3589dcc0d"),
name: 'Valery', age: 19
}
find - $or Условие ИЛИ
В качестве объекта так же внутрь можно передавать операторы для работы с условиями. Мы можем через {$or: [{первое условие}, {второе условие}]} передавать массив условий поиска определённых значений
db.users.find({$or:[{age: 25}, {age: 32}, {name: 'Rita'}]})
{
_id: ObjectId("6324b047183b76a3589dcc0e"),
name: 'Rita', age: 24
}
{
_id: ObjectId("6324b047183b76a3589dcc10"),
name: 'Varya', age: 32
}
{
_id: ObjectId("6324b047183b76a3589dcc11"),
name: 'Masya', age: 25
}
find - gt, gte, $ne, меньше, больше, либо равно, не равно
lte - less then or equal - ищет значения меньше или = заданному gte - greater or equal - ищет значения больше или = заданному $ne - not equal - ищет значения не равные заданным
Пример использования операции, которая выведет все объекты с возрастом меньше 30:
db.users.find({age: {$lt: 30}})
{ _id: ObjectId("6324aec2183b76a3589dcc0c"), name: 'Valery', age: 19 }
{ _id: ObjectId("6324b047183b76a3589dcc0d"), name: 'Valery', age: 19 }
{ _id: ObjectId("6324b047183b76a3589dcc0e"), name: 'Rita', age: 24 }
{ _id: ObjectId("6324b047183b76a3589dcc11"), name: 'Masya', age: 25 }
find.sort- Сортировка
Метод sort(), который вызывается после find, сортирует значения по определённому свойству. Задание сортировки зависит от числа 1 (возрастание) или -1 (убывание)
Конкретно в этом примере выведутся все записи в порядке возрастания
db.users.find().sort({age: 1})
А тут в порядке убывания
db.users.find().sort({age: -1})
find.limit - Ограничение по количеству получаемых документов
Функция limit()
позволяет нам ограничить число получаемых записей
db.users.find().limit(2)
{ _id: ObjectId("6324aec2183b76a3589dcc0c"), name: 'Valery', age: 19 }
{ _id: ObjectId("6324b047183b76a3589dcc0d"), name: 'Valery', age: 19 }
Так же имеется функция findOne({свойство_объекта}), которая позволяет вывести один объект, который удовлетворяет заданным условиям
db.users.findOne({_id: ObjectId("6324b047183b76a3589dcc0e")})
{
_id: ObjectId("6324b047183b76a3589dcc0e"),
name: 'Rita', age: 24
}
Уже функция distinct() вернёт только уникальные записи. В базе находится два поля с ‘Valery’. Дистинкт выведет все имена без повторений
db.users.distinct('name')
[ 'Galina', 'Masya', 'Rita', 'Valery', 'Varya' ]
Так же хочется сказать, что мы можем не просто найти одну запись, но так же и удалить/переместить/обновить её
update - $set обновление документов в коллекции
Функция update() модифицирует первую найденную запись. Однако лучше использовать updateOne() или updateMany()
db.users.update(
{name: "Valery"}, // Ищет запись с таким свойством
{
$set: { // Замена
name: "Ilon", // Имени
age: 15 // Возраста
}
}
)
Было две записи с ‘Valery’ - одна заменилась на введённые выше значения
{
_id: ObjectId("6324aec2183b76a3589dcc0c"),
name: 'Ilon', age: 15
}
{
_id: ObjectId("6324b047183b76a3589dcc0d"),
name: 'Valery', age: 19
}
update - $rename переименовать поле документа
Модификтор $rename переименует ключи
Конкретно в примере ключ name будет переименован в fullname
db.users.updateMany(
{},
{
$rename: {
name: "fullname"
}
}
)
{
_id: ObjectId("6324aec2183b76a3589dcc0c"),
age: 15,
fullname: 'Ilon'
}
delete - Удалить документ из коллекции
Функции deleteOne() и deleteMany() позволяют удалить поле по заданному свойству
Конкретно в этом примере удалится поле ‘Ilon’
db.users.deleteOne({age: 15})
BulkWrite - Множественный запрос
Метод bulkWrite([{}])
позволяет делать множественные запросы. Он принимает в себя массив объектов, внутри которых мы пишем сами запросы (добавить, удалить, обновить и так далее)
Конкретно в этом примере мы добавляем нового пользователя и удаляем другого
db.users.bulkWrite([
{
insertOne: {
document: {name: 'Nastya', age: 18}
}
},
{
deleteOne: {
filter: {fullname: 'Rita'}
}
}
])
Как можно увидеть в логе (который появляется при каждом обновлении), мы добавили и удалили одного пользователя
Типы связей
1 ко многим
Массив posts хранит в себе два объекта, которые относятся к одному пользователю
db.users.update(
{fullname: 'Masya'},
{
$set: {
posts: [
{title: 'JS', text: 'JS top'},
{title: 'mongo', text: 'mongo db'}
]
}
}
)
Через findOne() можно вывести только посты пользователя (если вторым параметром передать нужное нам свойство)
db.users.findOne(
{fullname: 'Masya'},
{posts: 1}
)
Тут мы ищем пользователя, у которого есть свойство posts, внутри которого есть свойство title. Провернуть такую операцию мы можем через $elemMatch
db.users.find(
{
posts: {
$elemMatch: {
title: "JS"
}
}
}
)
Так же есть модификатор $exists, который выведет нам пользователя, у которого существует свойство posts
db.users.find({posts: {$exists: true}})
Работа с MongoDB из Node
Установка зависимостей в проекте:
npm install -y // устанавливает все зависимости
npm install mongodb // устанавливает mongo в проекте
Далее нужно на удалённом сервере активировать этот сервер и взять с него ссылку (например, можно взять на том же mongodb atlas). Потом уже импортируем библиотеку монго в проект. Создаём нового клиента из МонгоКлиента. И далее мы можем описывать логику в том же синтаксисе, которым и пользовались в MongoShell