Глубокое понимание мангуста

Node.js задняя часть база данных MongoDB Mongoose

Mongoose – это библиотека, которую nodeJS предоставляет для подключения к mongodb. Она похожа на взаимосвязь между jquery и js. Она инкапсулирует и оптимизирует некоторые нативные методы mongodb. Проще говоря, Mongoose — это инкапсуляция операций базы данных MongoDB в среде узла, инструмент объектной модели, который преобразует данные в базе данных в объекты JavaScript для использования в приложениях.

install mongoose

npm install mongoose --save
const mongoose = require('mongoose'),
      connection = mongoose.connect('mongodb://127.0.0.1:27017/wechatShop', {
        useMongoClient: true
      });

Schema

Все в Mongoose начинается со схемы. Каждая схема сопоставляется с коллекцией MongoDB и определяет форму документов в этой коллекции. Схемы определяют не только структуру документов и свойств, но также методы экземпляра документа, методы статической модели, составные индексы и обработчики жизненного цикла для документов, называемые промежуточным программным обеспечением.

var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

Models

Используя определение нашей схемы, нам нужно преобразовать нашу схему блога в модель, которую мы можем использовать. Для этого мы передаем mongoose.model(modelName, schema).

var Blog = mongoose.model('Blog', blogSchema);

метод экземпляра

Экземпляры моделей являются документами. В документации есть много собственных встроенных методов экземпляра. Мы также можем определить наши собственные пользовательские методы экземпляра документа.

var Blog = mongoose.model('Blog', blogSchema);
var blog = new Schema({ name: String, type: String });//模型实例

Обычно используемые встроенные методы экземпляра:

удалить, установить, получить, аннулировать, заполнить, сохранить и т. д.

Подробный API можно найти в официальной документацииВстроенные методы экземпляра;

Теперь поговорим о пользовательских методах экземпляра. Пользовательский метод экземпляра — это просто метод расширения методов текущего экземпляра, как показано ниже:

animalSchema.methods.findSimilarTypes = function(cb) {
  return this.model('Animal').find({ type: this.type }, cb);
};

статический метод

Обычно используемые встроенные статические методы:

создать, найти, findOne и т. д.

Также легко добавлять статические методы в модель. Продолжаем нашу схему животных:

animalSchema.statics.findByName = function(name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
};

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function(err, animals) {
  console.log(animals);
});

помощник по запросам

Вы также можете добавить помощь в запросах, например методы экземпляра, но только для запросов мангуста. Вспомогательные методы запросов позволяют расширить API построителя запросов мангуста.

animalSchema.query.byName = function(name) {
  return this.find({ name: new RegExp(name, 'i') });
};

var Animal = mongoose.model('Animal', animalSchema);
Animal.find().byName('fido').exec(function(err, animals) {
  console.log(animals);
});

показатель

Mongoose также обрабатывает индексы.В mongoose есть два способа определить индексы.

Первый: определить непосредственно в схеме, как показано ниже

var User = mongoose.model('User', {
  username: {
      type: String,
      index: true
  },
  password: String
})

Второй: индекс единого определения

var User = mongoose.model('User', {
  username: {
      type: String
  },
  password: String
});

User.index({
    username: 1 / -1  (正向和逆向)
})

Отключить индексацию:

mongoose.connect('mongodb://user:pass@localhost:port/database', { config: { autoIndex: false } });
// or  
mongoose.createConnection('mongodb://user:pass@localhost:port/database', { config: { autoIndex: false } });
// or
animalSchema.set('autoIndex', false);
// or
new Schema({..}, { autoIndex: false });

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

Виртуальные свойства (например, документ)

Виртуальные свойства — это свойства документа, которые можно получить и установить, но нельзя сохранить в MongoDB. Полезно для форматирования или объединения полей, чтобы установщик мог составить одно значение для хранения нескольких значений.

Давайте сначала определим пример

// define a schema
var personSchema = new Schema({
  name: {
    first: String,
    last: String
  }
});

// compile our model
var Person = mongoose.model('Person', personSchema);

// create a document
var bad = new Person({
    name: { first: 'Walter', last: 'White' }
});

Предположим, мы хотим напечатать полное имя bad. Мы можем сделать это:

console.log(bad.name.first + ' ' + bad.name.last); // Walter White

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

personSchema.virtual('name.full').get(function () {
  return this.name.first + ' ' + this.name.last;
});

console.log('%s is insane', bad.name.full); // Walter White is insane

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

проверять

Прежде чем мы углубимся в детали синтаксиса проверки, помните о следующих правилах:

Проверка определяется в SchemaType

Валидация — это промежуточное ПО. Проверка регистра Mongoose по умолчанию действует как хук pre('save') в каждом режиме.

Вы можете запустить проверку вручную с помощью doc. проверить (обратный вызов) или doc.validateSync().

Валидатор не работает с неопределенными значениями. Единственным исключением является обязательный валидатор.

Проверка является асинхронной и рекурсивной; проверка вложенных документов также может выполняться при вызове Model#save. Если есть ошибка, ваш обратный вызов Model#save получает ее.

Проверка настраивается.

 var schema = new Schema({
      name: {
        type: String,
        required: true
      }
    });
    var Cat = db.model('Cat', schema);

    // This cat has no name :(
    var cat = new Cat();
    cat.save(function(error) {
      assert.equal(error.errors['name'].message,
        'Path `name` is required.');

      error = cat.validateSync();
      assert.equal(error.errors['name'].message,
        'Path `name` is required.');
    });
Mongoose имеет несколько встроенных валидаторов.

Все схемы имеют встроенные обязательные валидаторы. Требуемый валидатор удовлетворяет требуемому валидатору, используя значение, определенное функцией checkrequired() SchemaType.

Числа имеют максимальный (мужской) и минимальный (минимальный) валидатор.

Строка имеет валидаторы enum, match, maxLength и minLength.

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

 var breakfastSchema = new Schema({
      eggs: {
        type: Number,
        min: [6, 'Too few eggs'],
        max: 12
      },
      bacon: {
        type: Number,
        required: [true, 'Why no bacon?']
      },
      drink: {
        type: String,
        enum: ['Coffee', 'Tea']
      }
    });
    var Breakfast = db.model('Breakfast', breakfastSchema);

    var badBreakfast = new Breakfast({
      eggs: 2,
      bacon: 0,
      drink: 'Milk'
    });
    var error = badBreakfast.validateSync();
    assert.equal(error.errors['eggs'].message,
      'Too few eggs');
    assert.ok(!error.errors['bacon']);
    assert.equal(error.errors['drink'].message,
      '`Milk` is not a valid enum value for path `drink`.');

    badBreakfast.bacon = null;
    error = badBreakfast.validateSync();
    assert.equal(error.errors['bacon'].message, 'Why no bacon?');
пользовательская проверка

Если встроенных валидаторов недостаточно, вы можете настроить валидаторы в соответствии со своими потребностями.

var userSchema = new Schema({
      phone: {
        type: String,
        validate: {
          validator: function(v) {
            return /\d{3}-\d{3}-\d{4}/.test(v);
          },
          message: '{VALUE} is not a valid phone number!'
        },
        required: [true, 'User phone number required']
      }
    });
Обработка ошибок проверки

Errors возвращает объект ошибки после сбоя проверки, который на самом деле является объектом validatorerror. Каждая ошибка ValidatorError имеет свойства вида, пути, значения и сообщения.

var Person = db.model('Person', personSchema);
var person = new Person();

var error = person.validateSync();

совместный стол

Если вы использовали mysql, вы, должно быть, использовали соединение для объединения запросов к таблице, но в мангусте нет соединения, но он предоставляет более удобный и быстрый способ, Population.

Сначала определите две модели.

var User = mongoose.model('User', {
  username: String,
  password: String
})

var News = mongoose.model('News', {
  title: String,
  author: {
    type: mongoose.Schema.ObjectId,
    ref: 'User'
  }
});

затем добавьте данные

User.create({username:'ck',username:'滴滴'},function(err, data){
  console.log(data)
  News.create({title:'title',author:data},function(){

  })
})

вывести результат запроса на консоль

News.findOne().populate('author','username').exec(function(err, doc){
  console.log('==============',err, doc)
  //    ============== null { _id: 5a41d2e16f78a43c5873fe03,
  //    title: 'title',
  //    author: { _id: 5a41d2e16f78a43c5873fe02, username: 'ck' 
  //    },
  //    __v: 0 }
})
Приветствую всех больших ребят, чтобы исправить неправильные места в статье, большое спасибо, давайте учиться и прогрессировать вместе. блоггераАдрес GitHub, вы можете поднять вопрос на GitHub или оставить сообщение прямо в области комментариев под статьей.