# Используем Mongoose для работы с Mongodb

09:11
poster
В этом видео мы с вами разберем что такое пакет mongoose в nodejs. Для этого урока у вас должна быть установлена mongodb и node.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

В этом видео мы с вами разберем что такое пакет mongoose в nodejs. Для этого урока у вас должна быть установлена mongodb и node.

Итак mongoose - это ORM для базы данных mongodb для node. Для тех кто не знает, что такое ORM - это Object-relational mapping. То есть идея состоит, например, чтобы работать с mongodb в node мы могли бы использовать mongodb драйвер. Это очень низкоуровневая библиотека, которая просто дает возможность делать обращения к базе. ORM же позволяет создавать модели и зависимости между ними и использовать специальный API для работы с базой. Это, конечно, не так гибко, как выполнять запросы к базе напрямую, но дает возможность лучше структурировать ваш код.

Давайте попробуем.

У меня создан пустой проект в который я установил 2 пакета: mongoose и bluebird.

yarn install mongoose
yarn install bluebird

Пакет bluebird - это библиотека для промисов. Здесь она нам понадобится, чтобы указать mongoose, какие промисы нужно использовать.

Также, не забудьте, что вам нужно запустить процесс mongodb. Например на mac я его запускаю в консоли командой mongod.

Итак у меня есть index.js файл и в него давайте зарекваирим mongoose.

const mongoose = require('mongoose')

После этого мы хотим указать mongoose правильные промисы.

mongoose.Promise = require('bluebird');

Если вы не напишите эту строчку, то получите много варнингов от mongoose в консоли.

Далее мы хотим подключится к нашей базе mongodb. Это можно сделать с помощью команды connect.

mongoose.connect('mongodb://localhost/testmongoose', {
  useMongoClient: true
})

Первым параметром мы указываем host и название базы. Вторым параметром опции для connect.

После коннекта мы можем получить из mongoose connection, с которым мы дальше будем работать.

const db = mongoose.connection

Теперь мы должны обработать ошибку, например, если у нас не получилось подключиться к базе данных.

db.on('error', err => {
  console.log('error', err)
})

Если мы попробуем остановить процесс mongodb и запустить сервер, то мы получим ошибку, которую мы увидим именно из-за подписки на on error.

Теперь нам нужен евент о том, что мы успешно подключились к базе и можем писать наши запросы.

db.once('open', () => {
  console.log('we are connected')
})

Если мы перезапустим вебсервер и посмотрим в консоль, то у нас должнo вывестить "we are connected".

Теперь мы готовы к использованию mongoose.

Так как вся логика работы с mongoose построена на моделях, то нам нужно создать модель, с которой мы хотим работать. Давайте создадим модель User в отдельном файле models/user.

const mongoose = require('mongoose')

const userSchema = mongoose.Schema({
  name: String
})

const User = mongoose.model('User', userSchema)

module.exports = User

Сначала мы импортируем пакет mongoose и описываем схему нашего usera. У нас будет одно поле name, типа String. После этого мы должны из схемы создать модель. В этом нам поможет mongoose.model. И экспортируем ее, чтобы использовать в других местах.

Теперь давайте импортируем ее в index.js

const User = require('./models/user')

Теперь мы можем работать с моделью, а не с mongodb напрямую. Например, давайте создадим нового юзера.

const user = new User({name: 'Alex'})
console.log('user', user)

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

Но new User в базу ничего не сохраняет. Теперь, если мы хотим сохранить этого юзера в базу, то мы должны на экземпляре вызвать метод save.

user.save((err, user) => {
  if (err) {
    console.log('err', err)
  }
  console.log('saved user', user)
})

Если мы посмотрим в консоль, то наш user был успешно сохранен.

Теперь давайте попробуем найти этого юзера по id. Для этого давайте закомментим создание и напишем.

User.findById('59d8acf4ce867b292ddb815e', (err, user) => {
  console.log('result', err, user)
})

Mongoose предоставляет нам специальный метод, для поиска записи по id. Обратите внимание, что мы не указываем из какой коллекции брать данные. Mongoose сам создает под каждую модель нужную коллекцию и нам остается только использовать правильное API.

Возможности Mongoose достаточно обширны. Вы можете писать достаточно сложные запросы, добавлять к моделям свои собственные методы, генерировать поля по умолчанию, добавлять коллбеки при изменении записей и много другое.

Обязательно пишите в комментариях, если вы хотите больше уроков по функционалу и возможностям mongoose.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Атхам Султон
6 месяцев назад
Доброе утро а в мангусе не надо закрывать соединение после операции, как у mongodb? client.close()
monsterlessons
6 месяцев назад
Добрый день. Если вы говорите о development, то не нужно, так как у вас всего 1 коннекшен к базе данных. Если же вы запускаете тесты параллельно, например, то закрывать конекшен нужно, иначе они остаются висеть и потреблять память.
Moe Green
11 месяцев назад
Конечно хотелось бы больше по Mongoose! Совсем недавно освоил основы этого инструмента - классная штука! Пару замечаний по видео. 1. Пакет bluebird. В оф. доках mongoose ничего не говорится про этот пакет, но упоминается другая запись - mongoose.Promise = global.Promise. Я так понимаю, что последняя запись более актуальная? 2. Просто замечание - в версии 5 использовать useMongoClient уже не нужно - WARNING: The `useMongoClient` option is no longer necessary in mongoose 5.x
monsterlessons
11 месяцев назад
1. Можно использовать как global.Promise, так и bluebird. 2. Именно. Как я уже говорил, в большинстве пакетов авторы обожают меня API каждую новую версию
Roma M
1год назад назад
Как раз столкнулся с монгус, очень класный разбор хотелось бы ещё:) ещё по мидлвеерам, как их правильно юзать с монгус?
monsterlessons
1год назад назад
Спасибо. Постараюсь раскрыть подробнее в будущих уроках.
Віталій Антонюк
1год назад назад
Отличное видео, спасибо Конечно хочется больше видео
monsterlessons
1год назад назад
На здоровье. Хорошо, буду продолжать эту тему.
Ruslan Lytvynchuk
1год назад назад
Супер! Спасибо, ждем продолжение, а еще лучше хороший курс по SPA со всеми технологиями.
monsterlessons
1год назад назад
Спасибо за идею.