# Используем 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.

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