// 1. Познакомьтесь с мангустом.
const mongoose = require('mongoose')
// 2. Подключить локальную базу данных
let db = mongoose.connect('mongodb://localhost/test')
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
// we're connected!
});
В mongoose все начинается со схемы:
let tomSchema = mongoose.Schema({
name:String
})
//Далее компилируем эту схему в модель
let Tom = mongoose.model('Tom',tomSchema)
// Добавьте метод кода в эту модель
Tom.methods.code = function(){
let nickname = this.name ? "The programmar name is :" + this.name:'I don't have name'
console.log(nickname)
}
//Модель — это созданный нами класс документа, а каждый документ — это объект Tom
let Tomliu = new Tom({name:'liugezhou'})
Tomliu.code() //The programmar name is :liugezhou
// save
Tomliu.save(function(err,item){
if (err) return console.error(err);
item.speak();
})
// Получить все из Тома
Tom.find(function(err,tomlius){
if(err) return console.error(err);
console.log(tomlius)
})
//Получаем конкретные данные
Tom.find({name:/^liugezhou/},callback)
грамматика:
Разрешенные типы схем:
Помимо сопоставления коллекций, вы также можете определить
model
Нам нужно преобразовать схему в модель, используя
коллекция и документ
Методы экземпляра
const animalSchema = mongoose.Schema({type:String,name:String})
animalSchema.methods.findSameType = function (cb){
return this.model('Animal').find(type:this.type,cb)
}
const Animal = mongoose.model('Animal',animalSchema)
const dog = new Animal({type:'dog'})
dog.findSameType(function(err,dogs){
console.log(dogs)
})
статический метод
animalSchema.statics.findByName = function(name,cb) {
return this.find({name:new RegExp(name,'i')},cb)
}
const Animal = mongoose.model('Animal',animalSchema)
Animal.findByName('fido',function(err,animal){
console.log(animals)
})
Помощник по запросам
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);
});
индекс
var animalSchema = new Schema({
name: String,
type: String,
tags: { type: [String], index: true } // field level
});
animalSchema.index({ name: 1, type: -1 }); // schema level
Виртуальная ценность Виртуальная
// 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 axl = new Person({
name: { first: 'Axl', last: 'Rose' }
});
console.log(axl.name.first + ' ' + axl.name.last); // Axl Rose
personSchema.virtual('fullName').get(function () {
return this.name.first + ' ' + this.name.last;
});
console.log(axl.fullName); // Axl Rose
Вы также можете установить установщик виртуального значения. В следующем примере, когда вы назначаете виртуальное значение, его можно автоматически разделить на другие свойства:
personSchema.virtual('fullName').
get(function() { return this.name.first + ' ' + this.name.last; }).
set(function(v) {
this.name.first = v.substr(0, v.indexOf(' '));
this.name.last = v.substr(v.indexOf(' ') + 1);
});
axl.fullName = 'William Rose'; // Now `axl.name.first` is "William"
Параметры
new Schema({..}, options);
// or
var schema = new Schema({..});
schema.set(option, value);
Ниже приведены все допустимые типы схем для mongoose:
SchemeTypeПараметры
var schema1 = new Schema({
test: String // `test` is a path of type String
});
var schema2 = new Schema({
test: { type: String } // `test` is a path of type string
});
var shema2 = new Schema({
test:{
type:String,
lowercase:true
}
})
Все доступно
связанный с индексом
Можно использовать schema определение типа, связанное с индексом
Кэш операций
То есть вам не нужно ждать, пока вышеуказанное соединение isconnect завершится успешно. использоватьсоздаватьиз Mongoose models Отключить кеш,нужно изменить буферкомандсконфигурация,mongoose.set('bufferCommands',false)
Параметры
Метод подключения также принимает параметры параметров, которые передаются базовому драйверу MongoDB.
перезвонить
Функция Connect() принимает функцию перезвонить или возвращает обещание
keepAlive
Для длительно работающих фоновых приложений включение поддержки активности в течение миллисекунд является разумным шагом. Если вы этого не сделаете, вы можете часто получать ошибки «соединение закрыто», казалось бы, без всякой причины. mongoose.connect(uri, {keepAlive:120})
Schema
Скомпилируйте для создания функции. Они из примеров показывают, что вы можете начать с базы. данныхдержатьичитатьиз documents。var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);
Вышеуказанный параметр Tank представляет собой форму единственного числа, соответствующую коллекции, соответствующей модели. Mongoose автоматически найдет форму множественного числа названия модели. Например, в приведенном выше примере модель Tank соответствует резервуарам для сбора данных в базе данных. Функция .model() копирует схему Обязательно добавьте в схему все необходимое перед вызовом .model().
Конструировать документы
const Tank = mongoose.model('Tank',TankSchema)
const small = new Tank({ size:' small'})
small.save(function(err){
if (err) return hanldeError(err)
})
// or
Tank.create({size:'small'},function(err,small){
if (err) return handleError(err)
})
Запрос
удалить
Tank.remove({size:small},function(err){
if(err) return handler(err)
})
возобновлять
model
из update
Метод может быть модифицирован на базе данных документа, но документ не будет возвращен на прикладной уровень.возобновлять Используйте findById:
Tank.findById(id,function(err,tank){
if (err) return handlerError(err)
tank.size = 'large';
//tank.set({size:'large'})
tank.save(function(err,updateTank){
if (err) return handlerError(err)
res.send(updateTank)
})
})
Tank.update({_id:id},{$set:{size:‘large’}},callback)
Tank.findByIdAndUpdate(id,{$set:{size:'large'}},{new:true},function(err,tank){
if (err) return handlerError(err)
res.send(tank)
})
Вложенный документ — это документ, вложенный в другой документ. В Mongoose это означает, что вы можете вложить в него еще одну схему. Вложенные документы Mongoose имеют две разные концепции: массив вложенных документов и один вложенный вложенный документ.
const chidlSchema = new Schema({name:String})
const parentSchema = new Schema({
children:[childSchema],
child:childSchema
})
Разница между вложенными документами и документами заключается в том, что вложенные документы не могут быть сохранены отдельно, они сохраняются при сохранении их документа верхнего уровня.
const Parent = mongoose.model('Parent',parentSchema)
const parent = new Parent({children:[{name:'liu'},{name:'ge'},{name:'zhou;}]})
parent.children[0].name = 'liu'
parent.save(callback)
Давайте посмотрим на демо,Последний по имени атрибут в таблице Запросперсоны — это значение Ghost из документа.,Только Запрос Два поля: имя и род занятий
const Person = mpngoose.model('Pseron',PersonSchema);
Person.findOne({name.last:'Ghost'},'name occupation',function(err,person){
if(err) return handleError(err)
console.log('%s %s is a %s',person.name.fisrt,person.name.last,person.occupation)
})
Запрос результатов формата зависит от того, что происходит:
pre
Предварительные крючки делятся на два типа: «последовательные» и «параллельные».
Последовательное промежуточное программное обеспечение выполняется одно за другим. В частности, когда предыдущее промежуточное программное обеспечение вызывает next, следующее выполнение
const schema = new Schema(..);
schema.pre('save',function(next){
// to stuff
next()
})
В mongoose5.x помимо ручного вызова следующей функции вы также можете вернуть Promise или даже async/await.
schema.pre('save',function(){
return doStuff().
then(()=> doMoreStuff())
})
// or
shcema.pre('save',async function(){
await doStuff();
await doMoreStuff();
})
Параллельное промежуточное программное обеспечение обеспечивает детальное управление потоком.
const schema = new Schema(..)
shcema.pre('save',true,function(next,done){
next()
setTimeout(done,100)
})
В этом примере метод save не будет выполнен до тех пор, пока все промежуточные программы не вызовут метод Done. Сценарии использования:
Post
Пост-промежуточное ПО вызывается после выполнения метода. В это время каждое предварительное промежуточное ПО завершено.
schema.post('init',function(doc){
console.log('%s has been initialized from the db', doc._id);
})
schema.post('validate',function(doc){
console.log('%s has been validated (but not saved yet)', doc._id);
})
schema.post('save',function(doc){
console.log('%s has been saved', doc._id);
})
schema.post('remove',function(doc){
console.log('%s has been removed', doc._id);
})
если ты дашь post крюкизперезвонитьфункция передает два параметра, мангуст можно было бы подумать, что второй параметр функцию next() можно передать next Запустить следующее промежуточное программное обеспечение
schema.post('save',function(doc,next){
setTimeout(function(){
console.log('pot1')
next()
},100)
})
schema.post('save', function(doc, next) {
console.log('post2');
next();
});
Функция save() запускает хук validate(). Хук mongoose validate() на самом деле является хуком pre('save'), что означает, что все хуки pre('validate') и post('validate') будут выполнены. in pre('save') вызывается раньше.
Ни пре-, ни пост-перехватчики save() не выполняются в update(), findOneAndUpdate() и т. д. mongoose4.x разработал новые хуки для этих функций.
schema.pre('find',function(){
conosle.log(this instanceof mongoose.query) //true
this.start = Date.now()
})
schema.post('find',function(result){
conosle.log(this instanceof mongoose.query) //true
// prints returned documents
console.log('find() returned ' + JSON.stringify(result));
// prints number of milliseconds the query took
console.log('find() took ' + (Date.now() - this.start) + ' millis');
})
Ошибка обработки промежуточного программного обеспечения
next()
При ошибке выполнения выполнение промежуточного программного обеспечения немедленно прекращается. Но у нас есть особенный post Уловки промежуточного программного обеспечения решают эту проблему —— При обработке ошибок он может выполнить указанный вами код после возникновения ошибки. Ошибка обработки промежуточного программного обеспечение большего, чем обычное промежуточное программное обеспечениеerror
параметры иerr
Передается в качестве первого параметра. Тогда ошибка обработки промежуточного программного программное обеспечение позволяет вам свободно совершать ошибки при последующей обработке
const schema = new Schema({
name:{
type:String,
unique:true
}
})
schema.post('save',function(err,doc,next){
if (error.name === 'MongoError' && error.code === 11000) {
next(new Error('There was a duplicate key error'));
} else {
next(error);
}
})
Person.create([{name:'liu'},{name:'Gezhou'}]);
demo MongoDb существовать После 3.2 также есть такие вещи, как sql в join Для операций агрегации $lookup не работает, и mongoose Иметь более мощный заселить, может заставить вас существовать иначе, чем collection цитируется в document。 Populate Возможна автоматическая замена document в Укажите поле и замените содержимое из других collection Чтобы получить, мы заполняем один или несколько документ, один или несколько объектов или даже query Все объекты возвращены:
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const personSchema = Schema({
_id:Schema.types.ObjectId,
name:String,
age:Number,
stories:[{type:Schema.types.ObjectId,ref:'Story'}]
})
const storySchema = Schema({
author:{type:Schema.types.ObjectId,ref:'Person'},
title:String,
fans:[{type:Schema.types.ObjectId,ref:'Person'}]
})
const Story = mongose.model('Story',storySchema)
const Person = mongose.model('Person',personSchema)
Мы создали две модели: Person modelв stories Поля ObjectID массив,ссылка Параметры Рассказыватьmongoose существоватьнаполнениеизкогдаиспользовать Который модель, приведенный выше пример относится к Story из модель. Все хранилище существуетthisiz_id должно быть Story model в document из _id
держать refs держать refs Как и обычному атрибуту держать, просто присвойте ему значение _idiz.
const author = new Person({
_id:new mongoose.Types.objectId(),
name:'liugezhou',
age:18
})
author.save(function(err){
if (err) return handleError(err);
const story1 = new Story({
title:'my book',
author:author._id
})
story1.save(function(err){
if (err) return handleError(err);
})
})
Population
Story.
findOne({title:'my book'}).
populate('author').
exec(function(err,story){
if (err) return handleError(err);
console.log('The author is %s', story.author.name);
})
Установите поля для заполнения После mongoose4.0 вы можете вручную заполнить поле.
Story.findOne({title:'my book'},function(err,story){
if (err) return handleError(err);
story.author = author
console.log(story.author.name);
})
Дискриминатор – это schema механизм наследования. Это позволяет вам существовать так же, как базовый MongoDb. collectionначальствоиспользоватьчастичное перекрытиеиз schema Создать несколько model。