by Nick Karnik
Mongooseは、MongoDBおよびノード用のオブジェクトデータモデリング(ODM)ライブラリです。ジェイ-エス- データ間の関係を管理し、スキーマ検証を提供し、コード内のオブジェクトとMongoDB内のそれらのオブジェクトの表現との間の変換に使用されます。
MongoDBはスキーマレスNoSQLドキュメントデータベースです。, できJSON文書の構造をとることができたりではないから施行のようなSQLデータベースです。 これは、アプリケーション開発をスピードアップし、デプロイの複雑さを軽減するNoSQLを使用する利点の一つです。
以下は、Mongo対SQLデータベースにデータが格納される方法の例です。
用語
コレクション
Mongoの’コレクション’は、リレーショナルデータベースのテーブルと同等です。 複数のJSONドキュメントを保持できます。
Documents
‘Documents’は、SQLのレコードまたはデータ行と同等です。 SQL行は他のテーブルのデータを参照できますが、Mongoドキュメントは通常、それを文書内で結合します。
フィールド
‘フィールド’または属性は、SQLテーブルの列に似ています。
スキーマ
Mongoはスキーマレスですが、SQLはテーブル定義を介してスキーマを定義します。, マングースの”スキーマ”は、アプリケーション層を介して強制される文書データ構造(または文書の形状)です。
Models
‘Models’は、スキーマを取り、リレーショナルデータベース内のレコードと同等のドキュメントのインスタンスを作成する高次のコンストラクタです。
はじめに
Mongoのインストール
始める前に、Mongoをセットアップしましょう。, 次のいずれかのオプションから選択できます(この記事ではオプション#1を使用しています)。
- MongoDB Webサイトからオペレーティングシステムに適したMongoDBバージョンをダウンロードし、インストール手順に従ってください。
- mLabで無料のsandboxデータベースサブスクリプションを作成します。
- Dockerを使用してMongoをインストールします。dockerを使用したい場合は
簡略化されたアドレス帳のデータを表すモデルを実装して、Mongooseの基本のいくつかをナビゲートしましょう。Visual Studio Code、ノード8.9、およびNPM5.6を使用しています。, お気に入りのIDEを起動し、空白のプロジェクトを作成し、始めましょう! Nodeでは制限されたES6構文を使用するため、Babelの設定は行いません。
NPM Install
プロジェクトフォルダに移動してプロジェクトを初期化しましょう
npm init -y
次のコマンドでMongooseと検証ライブラリをインストールしましょう。
npm install mongoose validator
上記のインストールコマンドは、ライブラリの最新バージョンをインストールします。 この記事のMongoose構文は、Mongoose v5以降に固有のものです。,
データベース接続
プロジェクトルートの下にファイル./src/database.js
を作成します。
次に、データベースに接続するメソッドを持つ単純なクラスを追加します。
接続文字列は、インストールによって異なります。
上記のrequire(‘mongoose’)
呼び出しはシングルトンオブジェクトを返します。 これは、初めてrequire(‘mongoose’)
を呼び出すときに、Mongooseクラスのインスタンスを作成して返すことを意味します。, その後の呼び出しでは、ES6でモジュールのインポート/エクスポートがどのように機能するかによって、最初に作成されて返されたのと同じインスタンス
同様に、module.exports
ステートメントでクラスのインスタンスを返すことによって、データベースクラスをシングル,
ES6は、以前にインポートされたファイルの応答をキャッシュすることによってモジュールローダがどのように機能するかのために、シングルトン(単一イン
Mongooseスキーマとモデル
Mongooseモデルは、Mongooseスキーマのラッパーです。 Mongooseスキーマは、ドキュメントの構造、デフォルト値、バリデータなどを定義します。 一方、Mongooseモデルは、レコードの作成、照会、更新、削除などのためのデータベースへのインターフェイスを提供します。
Mongooseモデルの作成は、主に三つの部分で構成されます。
1., 参照Mongoose
let mongoose = require('mongoose')
この参照は、データベースに接続したときに返されたものと同じになります。
2. 定義のスキーマの変更
スキーマの定義ドキュメントプロパティを通してオブジェクトのキー名に対応するプロパティ名するものと期待される。,
let emailSchema = new mongoose.Schema({ email: String})
ここでは、モデルがデータベースに保存されたときにトリガーされる内部バリデータにマップされるスキーマ型Stringを持つemailというプロパティ 値のデータ型が文字列型でない場合は失敗します。
次のスキーマタイプが許可されます。
- Array
- Boolean
- Buffer
- Date
- Mixed(汎用/柔軟なデータタイプ)
- Number
- ObjectId
- String
MixedおよびObjectIdはrequire(‘mongoose’).Schema.Types
.
3., モデルのエクスポート
Mongooseインスタンスのモデルコンストラクタを呼び出し、コレクションの名前とスキーマ定義への参照を渡す必要があります。
module.exports = mongoose.model('Email', emailSchema)
上記のコードを./src/models/email.js
に組み合わせて、基本的な電子メールモデルの内容を定義しましょう。
スキーマ定義は単純でなければなりませんが、その複雑さは通常、アプリケーション要件に基づいています。 スキーマは再利用でき、いくつかの子スキーマも含めることができます。 上記の例では、emailプロパティの値は単純な値型です。, ただし、追加のプロパティを持つオブジェクト型にすることもできます。
上記で定義したモデルのインスタンスを作成し、次の構文を使用して設定できます。
let EmailModel = require('./email')let msg = new EmailModel({ email: '[email protected]'})
Emailスキーマを拡張して、emailプロパティを一意の必須フィールドにし、値を保存する前に小文字に変換しましょう。 また、値が有効な電子メールアドレスであることを確認する検証関数を追加することもできます。 先ほどインストールしたvalidatorライブラリを参照して使用します。,
基本操作
Mongooseには柔軟なAPIがあり、タスクを達成するための多くの方法を提供します。 これはこの記事の範囲外であるため、バリエーションに焦点を当てませんが、ほとんどの操作は構文的にまたはアプリケーションアーキテクチャを介して,
Create Record
emailモデルのインスタンスを作成してデータベースに保存しましょう。
結果は、保存が成功すると返されるドキュメントです。
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
次のフィールドが返されます(内部フィールドにはアンダースコアが付きます)。
-
_id
フィールドmongoによって自動生成され、コレクションの主キーです。 その値は、ドキュメントの一意の識別子です。 -
email
フィールドの値が返されます。, スキーマでlowercase:true
属性を指定したため、小文字になっていることに注意してください。 -
__v
は、Mongooseによって最初に作成されたときに各ドキュメントに設定されたversionKeyプロパティです。 その値には、文書の内部リビジョンが含まれます。
上記の保存操作を繰り返そうとすると、電子メールフィールドが一意であることを指定しているため、エラーが発生します。
Fetch Record
先ほどデータベースに保存したレコードを取得してみましょう。, のモデルクラスに挑む複数の静的およびインスタンス法を行う業務のデータベースです。 ここで、findメソッドを使用して以前に作成したレコードを検索し、メールを検索語として渡します。
EmailModel .find({ email: '[email protected]' // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })
返されるドキュメントは、レコードを作成したときに表示されたものと同様になります。
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
レコードを更新
電子メールアドレスを変更し、別のフィールドを追加することによって、上記のレコードを変更しましょう。, パフォーマンス上の理由から、Mongooseは更新されたドキュメントを返さないため、追加のパラメータを渡す必要があります。
返されたドキュメントには更新されたメールが含まれます。
{ _id: 5a78fe3e2f44ba8f85a2409a, email: '[email protected]', __v: 0 }
レコードを削除
findOneAndRemove
レコードを削除するための呼び出しを使用します。, これは、削除された元の文書を返します:
ヘルパー
CRUD(作成、読み取り、更新、削除)操作として知られている上記の基本機能のいくつかを見てきましたが、Mongooseはまた、いくつかのタイプのヘルパーメソッドとプロパティを設定する機能を提供します。 これらを使用すると、データの操作をさらに簡素化できます。
でユーザースキーマを作成しましょう./src/models/user.js
フィールドを使用してfirstName
およびlastName
:
仮想プロパティ
仮想プロパティはデータベースに永続化されません。, 値を取得および設定するためのヘルパーとしてスキーマに追加できます。
fullName
という仮想プロパティを作成して、firstName
およびlastName
に値を設定し、読み取り時に組み合わせた値として取得します。
getおよびsetのコールバックは、キーワード。 太い矢印関数を使用すると、this
が参照するものが変更されます。,
この設定firstName
とlastName
により価格をつけるfullName
上記のコードを出力しますの
{ _id: 5a7a4248550ebb9fafd898cf, firstName: 'Thomas', lastName: 'Anderson' } Thomas Anderson
インスタンスの方法
を作ることができまカスタムヘルパーにはスキーマとアクセスのモデルインスタンス. これらのメソッドはモデルオブジェクトにアクセスでき、非常に創造的に使用できます。 たとえば、現在のインスタンスと同じ名を持つすべてのユーザーを検索するメソッドを作成できます。,
この例では、現在のユーザーのイニシャルを返す関数を作成しましょう。 getInitials
というカスタムヘルパーメソッドをスキーマに追加しましょう。
userSchema.methods.getInitials = function() { return this.firstName + this.lastName}
このメソッドはモデルインスタンスを介してアクセスできます。
静的メソッド
インスタンスメソッドと同様に、スキーマに静的メソッドを作成できます。, データベース内のすべてのユーザーを取得するメソッドを作成しましょう。
ModelクラスでgetUsers
を呼び出すと、データベース内のすべてのユーザーが返されます。
UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })
インスタンスと静的メソッドを追加することは、コレクションとレコードに対するデータベース相互作用へのインターフェイスを実装するための良いアプローチです。
ミドルウェア
ミドルウェアは、パイプラインの特定の段階で実行される関数です。, Mongooseは、次の操作のためのミドルウェアをサポートしています。
- Aggregate
- Document
- Model
- Query
たとえば、モデルにはpre
とpost
二つのパラメータを取る関数があります。
- イベントのタイプ(‘init’,’validate’)
- イベントのタイプ(‘init’,’validate’)
- イベントのタイプ(‘init’,’validate’)
- イベントのタイプ(‘init’,’validate’),’save’,’remove’)
- このモデルインスタンスを参照して実行されるコールバック
createdAt
とupdatedAt
という二つのフィールドをスキーマに追加して例を試してみましょう。model.save()
が呼び出されると、pre(‘save’, …)
およびpost(‘save’, …)
トリガーされるイベント。 第二のパラメータを渡すことができる機能を要求されたときに呼び出されるイベントがトリガーされます。 これらの機能を取るパラメータは次の機能には、ミドルウェアます。,プリセーブフックを追加し、
createdAt
とupdatedAt
の値を設定しましょう。モデルを作成して保存しましょう。
createdAt
とupdatedAt
作成されたレコードがprinted:plugins
データベース内のすべてのコレクションでレコードが作成され、最後に更新されたタイミングを追跡したいとします。 上記のプロセスを繰り返す代わりに、プラグインを作成してすべてのスキーマに適用できます。,
ファイルを作成しましょう
./src/model/plugins/timestamp.js
上記の機能を再利用可能なモジュールとして複製します。このプラグインを使用するには、この機能を与えられるべきスキーマに渡すだけです。
クエリビルド
Mongooseには、MongoDBでサポートされている多くの複雑な操作を処理する非常に豊富なAPIがあります。 考えるクエリに対し段階的にクエリを構築す。,
この例では、次のようにします。
- すべてのユーザーを検索
- 最初の100レコードをスキップ
- 結果を10レコードに制限します
- firstNameフィールドで結果を並べ替えます
- firstNameを選択します
- そのクエリを実行します
閉じます
マングース これは、アプリケーション層でデータモデルを操作することを喜びにする便利で強力な機能がいっぱいの豊富なライブラリです。,
Mongoドライバを使用してMongoと直接やり取りできますが、Mongooseはデータ間の関係をモデル化して簡単に検証できるようにすることで、そのやり取りを簡
楽しい事実:Mongooseは信じられないほど才能のあるエンジニアであるValeri Karpovによって作成されました! 彼は平均スタックという用語を造語しました。
この記事が役に立った場合、??? そしてTwitterで私に従ってください。
- イベントのタイプ(‘init’,’validate’)
- イベントのタイプ(‘init’,’validate’)