# Statics и methods в Mongoose

10:10
poster
В этом видео мы разберем такие вещи, как statics и methods в mongoose и зачем они нужны.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

В этом видео мы разберем такие вещи, как statics и methods в mongoose и зачем они нужны.

Итак, у меня есть index файл, где мы подключили mongoose к нашей mongodb. Также, у нас есть модель юзера с одним полем name.

Давайте, для начала, создадим одного юзера.

const user = new User({name: 'Alex'})
user.save()

Теперь, давайте получим все записи в базе.

User.find({}, (err, users) => {
  console.log(err, users)
})

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

Представим, что мы хотим найти юзеров по имени. И мы должны написать поиск так, чтобы он искал имя в любом регистре. И даже вхождение имени. Для этого мы можем использовать регулярку.

User.findOne({name: new RegExp('alex', 'i')}, (err, user) => {
  console.log(err, user)
})

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

Намного удобнее было бы, если бы у нас был какой-то метод, который искал бы юзера по имени, и мы могли бы его везде переиспользовать. И в mongoose это можно сделать очень легко.

Мы можем добавить статический метод к нашей модели User.

userSchema.statics.findUserByName = (name, cb) => {
  return this.findOne({name: new RegExp(name, 'i')}, cb)
}

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

User.findUserByName('alex', (err, user) => {
  console.log(err, user)
})

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

Обратите внимание, что в модели мы использовали слово function, а не стрелочную функцию. Это потому, что нам важно сохранить this внутри этой функции.

Итак, статические методы нужны нам, когда мы хотим написать какую-то функцию, которую мы будем переиспользовать на нашей модели.

Теперь, давайте разберем methods в mongoose.

Давайте добавим поле country в нашу модель.

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

и обновим нашего юзера.

User.findUserByName('alex', (err, user) => {
  user.country = 'US'
  user.save((err, savedUser) => {
    console.log('saaa', err, savedUser)
  })
})

Теперь, у нашего юзера есть поле country. Давайте создадим еще одного юзера с страной US.

const user = new User({name: 'Bill', country: 'US'})
user.save()

Теперь, у нас есть в базе 2 юзера с одинаковой страной.

Представим, что с помощью функции findUserByName, мы нашли нужного нам юзера, и теперь хотим найти всех юзеров, которые живут в той же стране, что и наш юзер.

User.find({country: user.country}, (err, users) => {
  console.log('users', users)
})

Мы можем написать так, но этот код невозможно переиспользовать, потому что он даже никак не привязан к нашей модели.

Давайте создадим mongoose метод findSimilarUsersByCountry

userSchema.methods.findSimilarUsersByCountry = function (cb) {
  return this.model('User').find({country: this.country}, cb)
}

И мы можем вызывать его на экземпляре модели.

user.findSimilarUsersByCountry((err, users) => {
  console.log('users', users)
})

Как мы видим в консоли, код работает также, как и раньше.

Но мы получаем исходного юзера в похожих юзерах, что немного странно. Поэтому, давайте изменим этот участок кода.

userSchema.methods.findSimilarUsersByCountry = function (cb) {
  return this.model('User')
    .where('country', this.country)
    .where('_id').ne(this._id)
    .exec(cb)
}

Итак, основная разница между methods и statics в том, что methods вызываются у экземпляра класса, а statics у класса.

Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Moe Green
11 месяцев назад
Очень хорошо - мне понравилось! Узнал о существовании statics и разницы между methods. Маленькое замечание - работа в консоли - это круто, нужно и обязательно. Но, как мне кажется, стоило бы показать один из GUI-инструментов для работы с MongoDB (Robo 3T, Studio 3T или еще какую - на усмотрение автора).
monsterlessons
11 месяцев назад
На здоровье. Так как я не использую GUI инструменты, то лучше не буду о них рассказывать.
Moe Green
11 месяцев назад
дело Ваше - Вы автор! )
Moe Green
11 месяцев назад
Респект! Первый раз слышу у русскоязычного автора правильное произношение слова Schema! ))