sql >> データベース >  >> NoSQL >> MongoDB

MongoDBとMongooseの使用を開始する

    この投稿では、MongoDBデプロイメントにMongooseを使用して、アプリケーションデータをモデル化するためのより単純なスキーマベースのソリューションを作成する方法を紹介します。

    マングースとは何ですか?

    Mongooseは、「Node.js用のエレガントなMongoDBオブジェクトモデリング」です。 「。以前にMongoDBを使用して基本的なデータベース操作を試したことがある場合は、MongoDBが「スキーマレス」であることに気付いたかもしれません。より構造化されたデータベースの実装を検討していて、MongoDBの機能を活用したい場合、MongooseはODM( O )の1つです。 bject D ata M apping)ソリューション。

    簡単に説明するには、次のようなusersという名前のコレクションに挿入コマンドを実行します。

    
    db.users.insert({ name : 'Arvind', gender : 'male'});
    

    そしてその直後に、次のコマンドを実行できます:

    
    db.users.insert({ name : 'Arvind', gender : 'male', password : '!@#$'});
    

    そしてMongoDBは、列数(キーと値のペア)の変動について文句を言うことはありません。これは非常に柔軟です。ただし、データをより整理して構造化したい場合は、サーバーコードでそれを維持し、検証を記述して、コレクションに無関係なものが何も保存されていないことを確認する必要があります。これがマングースが生活を楽にする場所です。

    「Mongooseは、アプリケーションデータをモデル化するための簡単なスキーマベースのソリューションを提供し、組み込みの型キャスト、検証、クエリ構築、ビジネスロジックフックなどを備えています。 、箱から出して。」

    Node.jsとMongoDBをインストールする

    Mongooseを使用するには、Node.jsをインストールする必要があります。ここで情報を見つけることができます。

    開発を開始

    まず、楽しい遊び場を作りましょう。 myMongooseAppという名前の新しいフォルダーを作成し、ここでターミナル/プロンプトを開いて実行します:

    npm init
    

    これは、新しいノードプロジェクトの初期化に役立ちます。必要に応じて記入してください。次に、プロジェクトへの依存関係としてMongooseをインストールします。実行:

    npm install mongoose --save-dev

    次に、次のコマンドを実行してMongoDBサービスを開始します:

    mongod
    

    次に、ルートにindex.jsという名前の新しいファイルを作成し、お気に入りのエディターで開きます。以下のコードを追加します:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/myTestDB');
    
    var db = mongoose.connection;
    
    db.on('error', function (err) {
    console.log('connection error', err);
    });
    db.once('open', function () {
    console.log('connected.');
    });
    

    ここでは、Mongooseパッケージがデータベースに接続し、接続を初期化する必要があります。データベースの名前はmyTestDBです。

    次に、次を実行します:

    node index.js
    

    接続されたメッセージが表示されます。 nodemonという名前のノードパッケージを使用して、変更時にノードサーバーを自動的に再起動することもできます。

    これで、サンドボックスを再生する準備が整いました!

    マングーススキーマ

    スキーマはスケルトンのようなものであり、データ収集の外観の要です。ユーザーのコレクションを扱っている場合、スキーマは次のようになります。

    Name - String
    Age - Number
    Gender - String
    Date of Birth - Date
    

    製品のコレクションを扱っている場合、スキーマは次のようになります。

    SKU - String
    Name - String
    Price - Number
    InStock - Boolean
    Quantity - Number
    

    ドリフトを確認できます。このようなスキーマでデータを保護すると、ガベージデータを保存する可能性が大幅に減少します。

    スキーマについて理解したところで、Mongooseを使用してユーザースキーマを構築してみましょう。 index.jsに戻り、次のコードを追加します。

    var Schema = mongoose.Schema;
    var userSchema = new Schema({
    name : String,
    age : Number,
    DOB : Date,
    isAlive : Boolean
    });
    

    基本的なユーザー関連のフィールドとそのスキーマタイプをここで検索します。

    次に、スキーマからモデルを作成します。追加:

    var User = mongoose.model('User', userSchema);
    

    これで、ユーザーモデルの準備が整いました。これをベーススキーマとして使用して、ユーザーをデータベースに挿入します。このようにして、ユーザーコレクション内のすべてのドキュメントにスキーマにリストされたフィールドがあることがわかります。新しいユーザーインスタンスを作成してDBに保存しましょう。追加:

    var arvind = new User({
    name : 'Arvind',
    age : 99,
    DOB : '01/01/1915',
    isAlive : true
    });
    
    arvind.save(function (err, data) {
    if (err) console.log(err);
    else console.log('Saved : ', data );
    });
    

    次のように表示されます:

    Saved : { __v: 0,
    name: 'Arvind',
    age: 99,
    DOB: Fri Jan 01 1915 00:00:00 GMT+0530 (IST),
    isAlive: true,
    _id: 536a4866dba434390d728216 }
    

    面倒なことも問題もありません。モデルと対話するためのシンプルで簡単なAPI。

    各モデルにisYoungerという名前のメソッドを持たせたいとしましょう。このメソッドは、年齢が50未満の場合はtrueを返し、50歳を超える場合はfalseを返します。これを行うには、データベースに現在のユーザーを照会し、条件付けを確認して、trueまたはfalseを返します。

    しかし、このメソッドをユーザースキーマのすべてのモデルに実装したい場合はどうでしょうか。これがマングースでのやり方です:

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/myTestDB');
    
    var db = mongoose.connection;
    
    db.on('error', function (err) {
    console.log('connection error', err);
    });
    db.once('open', function () {
    console.log('connected.');
    });
    
    var Schema = mongoose.Schema;
    var userSchema = new Schema({
    name : String,
    age : Number,
    DOB : Date,
    isAlive : Boolean
    });
    
    userSchema.methods.isYounger = function () {
    return this.model('User').age < 50 ? true : false;
    }
    
    var User = mongoose.model('User', userSchema);
    
    var arvind = new User({
    name : 'Arvind',
    age : 99,
    DOB : '01/01/1915',
    isAlive : true
    });
    
    arvind.save(function (err, data) {
    if (err) console.log(err);
    else console.log('Saved ', data );
    });
    
    console.log('isYounger : ',arvind.isYounger());
    

    21行目にメソッド定義を追加すると、39行目の結果はfalseになります。これは、スキーマにメソッドを追加して、よりオブジェクト指向にするためのシンプルで便利な方法です。

    パスワードフィールドがある場合は、encryptPassword()などのメソッドを追加して、パスワードを暗号化し、comparePassword()を追加して、ログイン時にuserSchema自体とパスワードを比較できます。パスワード認証の詳細については、こちらをご覧ください。

    すぐに使用できるMongooseには、スキーマの作成時にいくつかのオプションも用意されています。たとえば、以下のスキーマ宣言を見ると、オプションstrict:false:

    が渡されています。
    var userSchema = new Schema({
    name : String,
    age : Number,
    DOB : Date,
    isAlive : Boolean
    }, {strict : false});
    

    strictオプションはデフォルトでtrueであり、「非スキーマ」キーと値のペアを保存することはできません。たとえば、これは保存されます:

    var arvind = new User({
    name : 'Arvind',
    age : 99,
    DOB : '01/01/1915',
    isAlive : true
    });
    

    一方:

    var arvind = new User({
    name : 'Arvind',
    age : 99,
    DOB : '01/01/1915',
    isAlive : true,
    bucketList : [{...}, {...}, {...} ]
    });
    

    スキーマの一部として宣言されていないため、上記のすべてからbucketList配列を除いて保存されます。したがって、サービスを利用するクライアントは、無効なデータをコレクションにダンプできません。

    もう1つの優れたオプションは、コレクションです。モデル名をコレクション名と同じにしたくない場合は、次のようなオプションとして名前を渡すことができます。

    var userSchema = new Schema({
    name : String,
    age : Number,
    DOB : Date,
    isAlive : Boolean
    }, {collection : 'appusers'});
    

    他のオプションのリストはここにあります。

    Mongooseを使用すると、保存前や保存後などのイベントをスキーマに追加して、それぞれのイベントで検証を実行したり、データを処理したり、他のクエリを実行したりすることもできます。これらのメソッドはミドルウェアと呼ばれます。

    簡単な例は、次のような並列ミドルウェアです。

    var userSchema = new Schema({
    name : String,
    age : Number,
    DOB : Date,
    isAlive : Boolean
    })
    schema.pre('save', true, function (next, done) {
    // calling next kicks off the next middleware in parallel
    next();
    doAsync(done);
    });
    
    の次のミドルウェア

    ミドルウェアの詳細については、こちらをご覧ください。次の投稿では、Yeomanを使用してMongoDBプロジェクトのスキャフォールディングを自動的に生成する方法について詳しく説明します。

    読んでくれてありがとう。コメントしてください。
    @arvindr21


    1. 100%の稼働時間のための地理的に分散されたMongoDBレプリカセット

    2. データ構造のredis操作はスレッドセーフですか

    3. 日付間隔でグループ化

    4. redisクライアントからLuaスクリプトを実行中にエラーが発生しました