Краткое изложение официальной документации mongoose
Краткое изложение официальной документации mongoose

1. мангуст

  • Установка: npm install mongoose
Язык кода:javascript
копировать
// 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 все начинается со схемы:

Язык кода:javascript
копировать
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)

2. Режим схемы

  • каждую схему из коллекции MongoDB и определите структуру документов в этой коллекции.

грамматика:

  • const shcema = mongoose.Schema({})

Разрешенные типы схем:

  • String
  • Boolean
  • Date
  • Number
  • Array
  • Buffer
  • Mixed
  • ObjectId

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

  • documentизinstance methods
  • modelизstatic Model methods
  • сложныйиндекс
  • Документ из жизненного цикла крюк,также стать промежуточным программным обеспечением

model

Нам нужно преобразовать схему в модель, используя

  • функция let model = mongoose.model(modelName,schema)

коллекция и документ

  • Коллекция эквивалентна базе реляционного типа. данныхвповерхность
  • Документ эквивалентен фрагменту данных. Здесь следует отметить кое-что особенное:
  • коллекция не требует, чтобы документы имели одинаковую структуру,Коллекторский документ не обязательно должен иметь одинаковые поля.,Для одного полясуществовать коллекцию в разных документах могут быть разные типы данных

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

  • Документы представляют собой модели экземпляров. Документы имеют свои собственные методы экземпляров. Конечно, мы также можем настроить свой собственный изметод.
Язык кода:javascript
копировать
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)
})

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

  • статический Разница между методом и методом экземпляра заключается в том, что метод экземпляра существует и доступен в каждом экземпляре модели, в то время как статический метод существует. метод напрямую доступен для каждой модели
Язык кода:javascript
копировать
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)
})

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

  • Помощник по запросам действует на экземплярах запросов, что упрощает определение собственных расширений из Запроса.
Язык кода:javascript
копировать
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);
});

индекс

  • Mongodb поддерживает вторичный indexes,существоватьmongooseсередина,Определение в нашем индексе существующей схемы,индексполяуровеньишема уровень
Язык кода:javascript
копировать
var animalSchema = new Schema({
  name: String,
  type: String,
  tags: { type: [String], index: true } // field level
});

animalSchema.index({ name: 1, type: -1 }); // schema level

Виртуальная ценность Виртуальная

  • [ ] Virtual — атрибут документа,Но не держите MongoDB,Геттеры можно использовать для форматирования и объединения данных полей.,Сеттеры могут легко разложить значение на несколько полей.
Язык кода:javascript
копировать
// 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' }
});

  • Если вы хотите зарегистрировать полное имя, вы можете сделать это:
Язык кода:javascript
копировать
console.log(axl.name.first + ' ' + axl.name.last); // Axl Rose

  • Но каждый раз так сшивать слишком хлопотно. Рекомендую васиспользоватьvirtual property getter, Этот метод позволяет определить fullName Атрибуты, но не обязательно хранить базу данных。
Язык кода:javascript
копировать
personSchema.virtual('fullName').get(function () {
  return this.name.first + ' ' + this.name.last;
});

  • сейчассуществовать, mongoose Можно позвонить getter доступ к функциям fullName свойство:
Язык кода:javascript
копировать
console.log(axl.fullName); // Axl Rose

  • если прав document использовать toJSON() или toObject(), по умолчанию не включает фиктивное значение, Вам нужно доплатить toObject() или ВОЗ toJSON() Передать параметры** { virtuals: true }**。

Вы также можете установить установщик виртуального значения. В следующем примере, когда вы назначаете виртуальное значение, его можно автоматически разделить на другие свойства:

Язык кода:javascript
копировать
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"

  • И снова фиктивное значение нельзя использовать для выбора поля Запроси, поскольку оно фиктивное. значение не хранится в MongoDB。

Параметры

  • Схема имеет множество настраиваемых параметров.,Вы можете пройти во время строительства или установить его напрямую.,Параметры,Еще не учитесь организовывать.
Язык кода:javascript
копировать
new Schema({..}, options);

// or

var schema = new Schema({..});
schema.set(option, value);

3. SchemaTypes — тип схемы.

Ниже приведены все допустимые типы схем для mongoose:

  • String
  • Boolean
  • Number
  • Array
  • Buffer
  • Date
  • Schema.Types.ObjectId
  • Schema.Types.Mixed
  • Schema.Types.Decimal128

SchemeTypeПараметры

  • Вы можете объявить схему напрямую type — это определенный тип или присваивается объект, содержащий атрибут type.
Язык кода:javascript
копировать
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
});

  • В дополнение к атрибуту типа,Вы также можете указать другие атрибуты для этого пути к полю.,Например, все слова перед существованием переводятся в нижний регистр.
Язык кода:javascript
копировать
var shema2 = new Schema({
	test:{
  	type:String,
    lowercase:true
  }
})

Все доступно

  • required:Логическое значениеили ВОЗфункция Если значение истинно, добавьте валидатор require для этого свойства.
  • default: любое значение или функция Установите значение по умолчанию для этого пути. Если это функция m, возвращаемое значение функции является значением по умолчанию.
  • select: Логическое значение обозначениеqueryизпо умолчаниюprojections
  • валидация: проверка функции
  • get:функция,использовать Object.defineProperty() определяет собственный метод получения
  • набор: То же, что и выше
  • псевдоним: псевдоним

связанный с индексом

Можно использовать schema определение типа, связанное с индексом

  • index: Логическое значение. Создавать ли индекс для этого атрибута.
  • unique:Логическое значение. Создавать ли уникальный индекс для этого атрибута.
  • sparse:Логическое значение    Создавать ли разреженный индекс для этого атрибута

4. Соединения-Соединения

  • Можно использовать mongoose.connect() подключается к MongoDB, порт по умолчанию — 27017.

Кэш операций

То есть вам не нужно ждать, пока вышеуказанное соединение isconnect завершится успешно. использоватьсоздаватьиз Mongoose models Отключить кеш,нужно изменить буферкомандсконфигурация,mongoose.set('bufferCommands',false)

Параметры

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

перезвонить

Функция Connect() принимает функцию перезвонить или возвращает обещание

keepAlive

Для длительно работающих фоновых приложений включение поддержки активности в течение миллисекунд является разумным шагом. Если вы этого не сделаете, вы можете часто получать ошибки «соединение закрыто», казалось бы, без всякой причины. mongoose.connect(uri, {keepAlive:120})

5. модели-модель

  • Models из Schema Скомпилируйте для создания функции. Они из примеров показывают, что вы можете начать с базы. данныхдержатьичитатьиз documents
  • отбаза данныесоздать и прочитать document из Все операции пройдены model Провести из.
Язык кода:javascript
копировать
var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);

Вышеуказанный параметр Tank представляет собой форму единственного числа, соответствующую коллекции, соответствующей модели. Mongoose автоматически найдет форму множественного числа названия модели. Например, в приведенном выше примере модель Tank соответствует резервуарам для сбора данных в базе данных. Функция .model() копирует схему Обязательно добавьте в схему все необходимое перед вызовом .model().

Конструировать документы

  • Documents — это экземпляр модели, созданный и хранящийся в базе. данные очень простые:
Язык кода:javascript
копировать
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)
})

Запрос

  • Для запроса документов можно использовать modelizfind, findbyId, findOne, и где эти статические метод。

удалить

  • Метод modelizremove позволяет удалить все соответствующие условию Запроса (условию) из документов.
Язык кода:javascript
копировать
Tank.remove({size:small},function(err){
	if(err) return handler(err)
})

возобновлять

  • model из update Метод может быть модифицирован на базе данных документа, но документ не будет возвращен на прикладной уровень.
  • Если вы хотите отделить документ и вернуть его на уровень приложения, можно использовать findOneAndUpdate метод.

6. Документы

  • Документ Mongoose представляет собой взаимно однозначное сопоставление документов MongoDB. Каждый документ является экземпляром его из Модели.

возобновлять Используйте findById:

Язык кода:javascript
копировать
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)

  • После возобновления нам все равно нужно вернуть этот документ: findByIdAndUpdate
Язык кода:javascript
копировать
Tank.findByIdAndUpdate(id,{$set:{size:'large'}},{new:true},function(err,tank){
  if (err) return handlerError(err)
  res.send(tank)
})

7. Поддокументы-Поддокументы

Вложенный документ — это документ, вложенный в другой документ. В Mongoose это означает, что вы можете вложить в него еще одну схему. Вложенные документы Mongoose имеют две разные концепции: массив вложенных документов и один вложенный вложенный документ.

Язык кода:javascript
копировать
const chidlSchema = new Schema({name:String})

const parentSchema =  new Schema({
	children:[childSchema],
  child:childSchema
})

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

Язык кода:javascript
копировать
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)         

8. Запросы

  • Модельиз Доступно несколько статических вспомогательных методов Запрос Документация
  • Экземпляр Query имеет функцию .then(), которая используется аналогично Promise.

Давайте посмотрим на демо,Последний по имени атрибут в таблице Запросперсоны — это значение Ghost из документа.,Только Запрос Два поля: имя и род занятий

Язык кода:javascript
копировать
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)
})

Запрос результатов формата зависит от того, что происходит:

  • findOne() — это один документ
  • find() — это список документов
  • count() — количество документов
  • update() возобновление количества документов

9. Промежуточное ПО – Промежуточное ПО

  1. промежуточное программное обеспечение (предварительно и post крюк)дасуществоватьасинхронныйфункция При выполнениифункциявходящийизконтрольфункция。
  2. Middleware is specified on the shema.
  3. Mongoose4.xЕсть четыре видасерединапромежуточное программное обеспечение:doucumentсерединапромежуточное программное обеспечение、modelсерединапромежуточное программное обеспечение、aggregateсерединапромежуточное программное обеспечение、queryсерединапромежуточное программное обеспечение。
  4. document Промежуточное программное обеспечение поддерживает следующие операции с документами:
    1. init
    2. validate
    3. save
    4. remove
  5. query Промежуточное ПО поддерживает следующее Model и Query действовать
    1. count
    2. find
    3. findOne
    4. findOneAndUpdate
    5. findOneAndRemove
    6. updade
  6. aggregate Промежуточное программное обеспечение действует на MyModel.aggregate(), он будет существовать у вас aggregate Вызов объекта Выполняется во время exec()
    1. aggregate
  7. ModelПромежуточное ПО поддерживает следующеедействовать:
    1. insertMany
  8. Поддерживается все промежуточное программное обеспечение pre и post крюк.
  9. Query Нет хук Remove(), только docuemnt Да, если установлен ремукрюк, он будет постоянно вам звонить вместо этого срабатывает myDoc.remove() myModel.remove(), кроме того, функция create() вызовет save()крюк.

pre

Предварительные крючки делятся на два типа: «последовательные» и «параллельные».

  • Серийный:

Последовательное промежуточное программное обеспечение выполняется одно за другим. В частности, когда предыдущее промежуточное программное обеспечение вызывает next, следующее выполнение

Язык кода:javascript
копировать
const schema = new Schema(..);
schema.pre('save',function(next){
	// to stuff
  next()
})

В mongoose5.x помимо ручного вызова следующей функции вы также можете вернуть Promise или даже async/await.

Язык кода:javascript
копировать
schema.pre('save',function(){
	return doStuff().
					then(()=> doMoreStuff())
})

// or

shcema.pre('save',async function(){
	await doStuff();
  await doMoreStuff();
})
  • параллельный

Параллельное промежуточное программное обеспечение обеспечивает детальное управление потоком.

Язык кода:javascript
копировать
const schema = new Schema(..)

shcema.pre('save',true,function(next,done){
	next()
  setTimeout(done,100)
})

В этом примере метод save не будет выполнен до тех пор, пока все промежуточные программы не вызовут метод Done. Сценарии использования:

  • Комплексная проверка данных
  • удалить зависимые документы (удалить сообщение пользователя, удалить его из всех документов)
  • asynchronous defaults
  • asynchronous tasks that a certain action triggers

Post

Пост-промежуточное ПО вызывается после выполнения метода. В это время каждое предварительное промежуточное ПО завершено.

Язык кода:javascript
копировать
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 Запустить следующее промежуточное программное обеспечение

Язык кода:javascript
копировать
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') вызывается раньше.

  • Примечания по использованию findAndUpdate() и промежуточного программного обеспечения Query

Ни пре-, ни пост-перехватчики save() не выполняются в update(), findOneAndUpdate() и т. д. mongoose4.x разработал новые хуки для этих функций.

Язык кода:javascript
копировать
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 Передается в качестве первого параметра. Тогда ошибка обработки промежуточного программного программное обеспечение позволяет вам свободно совершать ошибки при последующей обработке

Язык кода:javascript
копировать
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'}]);

10. Заполнить-заполнить

demo MongoDb существовать После 3.2 также есть такие вещи, как sql в join Для операций агрегации $lookup не работает, и mongoose Иметь более мощный заселить, может заставить вас существовать иначе, чем collection цитируется в document。 Populate Возможна автоматическая замена document в Укажите поле и замените содержимое из других collection Чтобы получить, мы заполняем один или несколько документ, один или несколько объектов или даже query Все объекты возвращены:

Язык кода:javascript
копировать
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.

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
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 вы можете вручную заполнить поле.

Язык кода:javascript
копировать
Story.findOne({title:'my book'},function(err,story){
	if (err) return handleError(err);
  
  story.author = author
  console.log(story.author.name);
})

11. Дискриминатор – Дискриминатор

Дискриминатор – это schema механизм наследования. Это позволяет вам существовать так же, как базовый MongoDb. collectionначальствоиспользоватьчастичное перекрытиеиз schema Создать несколько model。

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода