
В этом видео мы с вами разберем что такое пакет 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.