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

マングースベースのアプリアーキテクチャ

    Node.js、Express、Mongooseを初めて使用したときは、コードのスケーリングに苦労していました。私の答えの目的は、単なるブログ以上の作業をしている人を支援することですが、さらに大規模でスケーラブルなプロジェクトを支援することです。

    • 私は常にデータベースに接続しています。必要に応じて接続を開いたり閉じたりしません
    • index.jsを使用しています 他の言語で行うのと同じように、フォルダのルートファイルとして
    • モデルは独自のドキュメントに保持され、require() dをmodels/index.jsに挿入します ファイル。
    • ルートはモデルに似ており、各ルートレベルには、index.jsを持つフォルダーがあります。 順番にファイル。したがって、http://example.com/api/documents/:idのようなものを簡単に配置できます。 。また、ファイル構造を確認するときにも意味があります。

    私が使用しているものの構造は次のとおりです。

    -- app.js
    -- models/
    ---- index.js
    ---- blog.js
    -- mongoose/
    ---- index.js
    -- routes/
    ---- index.js
    ---- blog/index.js
    -- public/
    -- views/
    ---- index.{your layout engine} => I use Jade.lang
    -- methods/
    ---- index.js => use if you'd rather write all your functions here
    ---- blog.js => can store more complex logic here
    

    app.js

    var db = require('./mongoose'),
      express = require('express');
    // note that I'm leaving out the other things like 'http' or 'path'
    var app = express();
    
    // get the routes
    require('./routes')(app);
    // I just require routes, without naming it as a var, & that I pass (app)
    

    mongoose / index.js

    // Mongoose connect is called once by the app.js & connection established
    // No need to include it elsewhere
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/blog');
    
    // I have just connected, and I'm not exporting anything from here
    

    models / index.js

    // Logic here is to keep a good reference of what's used
    
    // models
    Blog = require('./blog');
    // User = require('./user');
    
    // exports
    exports.blogModel = Blog.blogModel;
    // exports.userModel = User.userModel;
    

    models / blog.js

    したがって、作業するすべてのモデルに対して、model.jsを作成します。 ドキュメントを作成し、models/index.jsに追加します その上。例として、Userを追加しました モデルですがコメントアウトしました。

    // set up mongoose
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
    
    var BlogSchema = Schema({
      header: {type: String },
      author: {type: String },
      text: {type: String },
      _id: { type: ObjectId } // not necessary, showing use of ObjectId
    });
    
    Blog = mongoose.model('Blog', BlogSchema);
    // the above is necessary as you might have embedded schemas which you don't export
    
    exports.blogModel = Blog;
    

    routers / index.js

    module.exports = function(app) {
      app.get('/', function(req, res) {
        // do stuff
      });
      require('./blog')(app);
      // other routes entered here as require(route)(app);
      // we basically pass 'app' around to each route
    }
    

    routers / blog / index.js

    module.exports = function(app) {
      app.get('/blog', function(req, res) {
        // do stuff
      });
      require('./nested')(app);
      // this is for things like http://example.com/blog/nested
      // you would follow the same logic as in 'routes/index.js' at a nested level
    }
    

    推奨される使用法

    • モデル:ドキュメントを処理するロジックを作成するため。つまり、作成、更新、削除、検索。
    • ルート:最小限のコーディング。httpデータを解析し、モデルのインスタンスを作成してから、関連するモデルにクエリを送信する必要がある場合のみ。
    • メソッド:モデルを直接含まない、より複雑なロジック用。例として、私はalgorithms/を持っています アプリで使用するすべてのアルゴリズムを保存するフォルダー。

    これがより明確になることを願っています。この構造は、わかりやすいと思うので、私にとっては不思議に思っています。



    1. MongoDB $ isoWeek

    2. マングースサブドキュメントとネストされたスキーマ

    3. ObjectIdに対する正規表現を使用してMongoDBをクエリします

    4. RedisでSpringキャッシングを使用する場合、特定の時間に有効期限キーを設定します