Mongoose 是一個 MongoDB 物件建模工具,設計用於非同步環境。 Mongoose 支援 Node.js 和 Deno (alpha)。
官方文件網站是 mongoosejs.com。
Mongoose 8.0.0 於 2023 年 10 月 31 日發布。
查看插件搜尋網站,查看社區中的數百個相關模組。接下來,從文件或這篇部落格文章中了解如何編寫自己的外掛程式。
始終歡迎拉取請求!請將拉取請求基於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]>
特此免費授予任何獲得本軟體和相關文件文件(「軟體」)副本的人不受限制地使用本軟體,包括但不限於使用、複製、修改、合併的權利、發布、分發、再授權和/或銷售軟體的副本,並允許向其提供軟體的人員這樣做,但須滿足以下條件:
上述版權聲明和本授權聲明應包含在本軟體的所有副本或主要部分中。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.