Mongoose — это инструмент объектного моделирования MongoDB, предназначенный для работы в асинхронной среде. Mongoose поддерживает Node.js и Deno (альфа).
Официальный сайт документации — mongoosejs.com.
Mongoose 8.0.0 был выпущен 31 октября 2023 г. Более подробную информацию об обратных изменениях в версии 8.0.0 можно найти на нашем сайте документации.
Посетите сайт поиска плагинов, чтобы увидеть сотни связанных модулей от сообщества. Затем узнайте, как написать свой собственный плагин, из документации или этого сообщения в блоге.
Запросы на вытягивание всегда приветствуются! Пожалуйста, базируйте запросы на включение в master
ветке и следуйте руководству по участию.
Если ваши запросы на включение вносят изменения в документацию, не изменяйте файлы .html
. Файлы .html
представляют собой скомпилированный код, поэтому внесите изменения в docs/*.pug
, lib/*.js
или test/docs/*.js
.
Просмотреть всех 400+ участников.
Сначала установите Node.js и MongoDB. Затем:
npm install mongoose
Mongoose 6.8.0 также включает альфа-поддержку Deno.
// Using Node.js `require()`
const mongoose = require ( 'mongoose' ) ;
// Using ES6 imports
import mongoose from 'mongoose' ;
Или используйте createRequire()
Deno для поддержки CommonJS следующим образом.
import { createRequire } from 'https://deno.land/[email protected]/node/module.ts' ;
const require = createRequire ( import . meta . url ) ;
const mongoose = require ( 'mongoose' ) ;
mongoose . connect ( 'mongodb://127.0.0.1:27017/test' )
. then ( ( ) => console . log ( 'Connected!' ) ) ;
Затем вы можете запустить приведенный выше сценарий, используя следующее.
deno run --allow-net --allow-read --allow-sys --allow-env mongoose-test.js
Доступно как часть подписки Tidelift.
Разработчики mongoose и тысяч других пакетов работают с Tidelift, чтобы обеспечить коммерческую поддержку и обслуживание зависимостей с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом специалистам по сопровождению именно тех зависимостей, которые вы используете. Узнать больше.
Сначала нам нужно определить соединение. Если ваше приложение использует только одну базу данных, вам следует использовать mongoose.connect
. Если вам нужно создать дополнительные соединения, используйте mongoose.createConnection
.
И connect
, и createConnection
принимают URI mongodb://
или параметры host, database, port, options
.
await mongoose . connect ( 'mongodb://127.0.0.1/my_database' ) ;
После подключения в экземпляре Connection
запускается событие open
. Если вы используете mongoose.connect
, Connection
будет mongoose.connection
. В противном случае возвращаемое значение mongoose.createConnection
— это Connection
.
Примечание. Если локальное соединение не удалось, попробуйте использовать 127.0.0.1 вместо localhost. Иногда проблемы могут возникнуть при изменении локального имени хоста.
Важный! Mongoose буферизует все команды, пока не подключится к базе данных. Это означает, что вам не нужно ждать, пока он подключится к MongoDB, чтобы определять модели, выполнять запросы и т. д.
Модели определяются через интерфейс Schema
.
const Schema = mongoose . Schema ;
const ObjectId = Schema . ObjectId ;
const BlogPost = new Schema ( {
author : ObjectId ,
title : String ,
body : String ,
date : Date
} ) ;
Помимо определения структуры ваших документов и типов данных, которые вы храните, схема определяет:
В следующем примере показаны некоторые из этих функций:
const Comment = new Schema ( {
name : { type : String , default : 'hahaha' } ,
age : { type : Number , min : 18 , index : true } ,
bio : { type : String , match : / [a-z] / } ,
date : { type : Date , default : Date . now } ,
buff : Buffer
} ) ;
// a setter
Comment . path ( 'name' ) . set ( function ( v ) {
return capitalize ( v ) ;
} ) ;
// middleware
Comment . pre ( 'save' , function ( next ) {
notify ( this . get ( 'email' ) ) ;
next ( ) ;
} ) ;
Взгляните на пример в examples/schema/schema.js
чтобы увидеть комплексный пример типичной настройки.
Как только мы определим модель через mongoose.model('ModelName', mySchema)
, мы сможем получить к ней доступ через ту же функцию.
const MyModel = mongoose . model ( 'ModelName' ) ;
Или просто сделай все сразу
const MyModel = mongoose . model ( 'ModelName' , mySchema ) ;
Первый аргумент — это единственное имя коллекции, для которой предназначена ваша модель. Mongoose автоматически ищет версию имени вашей модели во множественном числе . Например, если вы используете
const MyModel = mongoose . model ( 'Ticket' , mySchema ) ;
Тогда MyModel
будет использовать коллекцию билетов , а не коллекцию билетов . Более подробную информацию можно найти в документации модели.
Получив нашу модель, мы можем создать ее экземпляр и сохранить:
const instance = new MyModel ( ) ;
instance . my . key = 'hello' ;
await instance . save ( ) ;
Или можем найти документы из той же коллекции
await MyModel . find ( { } ) ;
Вы также можете findOne
, findById
, update
и т. д.
const instance = await MyModel . findOne ( { /* ... */ } ) ;
console . log ( instance . my . key ) ; // 'hello'
Для более подробной информации ознакомьтесь с документацией.
Важный! Если вы открыли отдельное соединение с помощью mongoose.createConnection()
но попытались получить доступ к модели через mongoose.model('ModelName')
оно не будет работать должным образом, поскольку оно не подключено к активному соединению с базой данных. В этом случае получите доступ к вашей модели через созданное вами соединение:
const conn = mongoose . createConnection ( 'your connection string' ) ;
const MyModel = conn . model ( 'ModelName' , schema ) ;
const m = new MyModel ( ) ;
await m . save ( ) ; // works
против
const conn = mongoose . createConnection ( 'your connection string' ) ;
const MyModel = mongoose . model ( 'ModelName' , schema ) ;
const m = new MyModel ( ) ;
await m . save ( ) ; // does not work b/c the default connection object was never connected
В первом фрагменте примера мы определили ключ в схеме, который выглядит следующим образом:
comments: [Comment]
Где Comment
— это созданная нами Schema
. Это означает, что создавать встроенные документы так же просто, как:
// retrieve my model
const BlogPost = mongoose . model ( 'BlogPost' ) ;
// create a blog post
const post = new BlogPost ( ) ;
// create a comment
post . comments . push ( { title : 'My comment' } ) ;
await post . save ( ) ;
То же самое касается и их удаления:
const post = await BlogPost . findById ( myId ) ;
post . comments [ 0 ] . deleteOne ( ) ;
await post . save ( ) ;
Встроенные документы обладают всеми теми же функциями, что и ваши модели. Значения по умолчанию, валидаторы, промежуточное программное обеспечение.
См. страницу документации.
Вы можете перехватывать аргументы метода через промежуточное программное обеспечение.
Например, это позволит вам транслировать изменения в ваших документах каждый раз, когда кто-то set
новое значение для пути sa в вашем документе:
schema . pre ( 'set' , function ( next , path , val , typel ) {
// `this` is the current Document
this . emit ( 'set' , path , val ) ;
// Pass control to the next pre
next ( ) ;
} ) ;
Более того, вы можете изменить входящие аргументы method
, чтобы последующее промежуточное программное обеспечение видело разные значения этих аргументов. Для этого просто передайте новые значения в next
:
schema . pre ( method , function firstPre ( next , methodArg1 , methodArg2 ) {
// Mutate methodArg1
next ( 'altered-' + methodArg1 . toString ( ) , methodArg2 ) ;
} ) ;
// pre declaration is chainable
schema . pre ( method , function secondPre ( next , methodArg1 , methodArg2 ) {
console . log ( methodArg1 ) ;
// => 'altered-originalValOfMethodArg1'
console . log ( methodArg2 ) ;
// => 'originalValOfMethodArg2'
// Passing no arguments to `next` automatically passes along the current argument values
// i.e., the following `next()` is equivalent to `next(methodArg1, methodArg2)`
// and also equivalent to, with the example method arg
// values, `next('altered-originalValOfMethodArg1', 'originalValOfMethodArg2')`
next ( ) ;
} ) ;
type
при использовании в схеме имеет особое значение в Mongoose. Если ваша схема требует использования type
в качестве вложенного свойства, вы должны использовать нотацию объекта:
new Schema ( {
broken : { type : Boolean } ,
asset : {
name : String ,
type : String // uh oh, it broke. asset will be interpreted as String
}
} ) ;
new Schema ( {
works : { type : Boolean } ,
asset : {
name : String ,
type : { type : String } // works. asset is an object with a type property
}
} ) ;
Mongoose построен на основе официального драйвера MongoDB Node.js. Каждая модель mongoose хранит ссылку на собственную коллекцию драйверов MongoDB. Доступ к объекту коллекции можно получить с помощью YourModel.collection
. Однако использование объекта коллекции напрямую обходит все функции mongoose, включая перехваты, проверку и т. д. Единственное заметное исключение: YourModel.collection
по-прежнему буферизует команды. Таким образом, YourModel.collection.find()
не вернет курсор.
Здесь вы найдете документацию по API, созданную с помощью dox и acquit.
Авторские права (c) 2010 LearnBoost <[email protected]>
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на использование Программного обеспечения без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и настоящее уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.