Mongoose 是一个 MongoDB 对象建模工具,设计用于异步环境。 Mongoose 支持 Node.js 和 Deno (alpha)。
官方文档网站是 mongoosejs.com。
Mongoose 8.0.0 于 2023 年 10 月 31 日发布。您可以在我们的文档网站上找到有关 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 的 alpha 支持。
// Using Node.js `require()`
const mongoose = require ( 'mongoose' ) ;
// Using ES6 imports
import mongoose from 'mongoose' ;
或者,使用 Deno 的createRequire()
来支持 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
都采用mongodb://
URI 或参数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
就会使用tickets集合,而不是tickets集合。有关更多详细信息,请阅读模型文档。
一旦我们有了模型,我们就可以实例化它并保存它:
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
为新值时,这将允许您广播有关文档的更改:
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
访问集合对象。然而,使用集合对象直接绕过了猫鼬的所有功能,包括钩子、验证等。一个值得注意的例外是YourModel.collection
仍然缓冲命令。因此, YourModel.collection.find()
将不会返回游标。
在此处查找使用 dox 和 acquit 生成的 API 文档。
版权所有 (c) 2010 LearnBoost <[email protected]>
特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地使用本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售软件的副本,并允许向其提供软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有者均不对因本软件或本软件中的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同、侵权行为还是其他行为。软件。