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 }
})