Mongoose は、非同期環境で動作するように設計された MongoDB オブジェクト モデリング ツールです。 Mongoose は Node.js と Deno (アルファ) をサポートしています。
公式ドキュメント Web サイトは 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 のアルファ サポートも含まれています。
// Using Node.js `require()`
const mongoose = require ( 'mongoose' ) ;
// Using ES6 imports
import mongoose from 'mongoose' ;
または、次のように CommonJS サポートのために Deno のcreateRequire()
使用します。
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 と協力して、アプリケーションの構築に使用するオープンソースの依存関係に対する商用サポートとメンテナンスを提供しています。使用する正確な依存関係の保守者に料金を支払いながら、時間を節約し、リスクを軽減し、コードの健全性を向上させます。もっと詳しく知る。
まず、接続を定義する必要があります。アプリがデータベースを 1 つだけ使用する場合は、 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
です。
注:ローカル接続が失敗した場合は、localhost の代わりに 127.0.0.1 を使用してみてください。ローカルホスト名が変更されたときに問題が発生することがあります。
重要! 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')
を介してモデルにアクセスしようとすると、アクティブな DB 接続に接続されていないため、期待どおりに動作しません。この場合、作成した接続を通じてモデルにアクセスします。
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 ( ) ;
埋め込みドキュメントは、モデルと同じ機能をすべて利用できます。デフォルト、バリデーター、ミドルウェア。
ドキュメントページを参照してください。
ミドルウェアを介してメソッドの引数をインターセプトできます。
たとえば、これにより、誰かがドキュメント内の sa パスを新しい値に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
を使用してアクセスできます。ただし、コレクション オブジェクトを直接使用すると、フックや検証などを含むすべてのマングース機能がバイパスされます。注目すべき例外の 1 つは、 YourModel.collection
が依然としてコマンドをバッファリングすることです。そのため、 YourModel.collection.find()
カーソルを返しません。
ここで、dox と aquit を使用して生成された API ドキュメントを見つけてください。
著作権 (c) 2010 LearnBoost <[email protected]>
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。