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

Node.jsで機能しない外部モジュールのスキーマ

    個人的には、initメソッドを使用して個別の「共通」プロジェクトを作成し、すべてのモデルをmongodbに登録し、モデルへのアクセスが必要なアプリのapp.jsファイルでinitメソッドを呼び出します。

    1. 共有プロジェクトを作成する -標準のプロセスに従って、新しいノードプロジェクトを作成します。
    2. package.json -共有プロジェクトで、package.jsonを設定します 次のエントリを含むファイル:

      "main": "index.js"
      
    3. モデルを追加 -新しいmodelsを作成します 共有プロジェクト内のフォルダー。すべてのマングーススキーマとプラグインが含まれます。 userSchemaファイルをmodelsフォルダーに追加し、user.jsという名前を付けます。 。

      var mongoose = require('mongoose');
      
      var userSchema = new mongoose.Schema({
          email: String
      });
      
      module.exports = mongoose.model('User', userSchema);
      
    4. index.js -次に、プロジェクトのルートindex.js ファイルは、アプリで使用できる共有オブジェクトを作成し、モデルとinitを公開します 方法。これをコーディングする方法はたくさんありますが、私が行っている方法は次のとおりです。

      function Common() {
          //empty array to hold mongoose Schemas
          this.models = {};
      }
      
      Common.prototype.init = function(mongoose) {
          mongoose.connect('your mongodb connection string goes here');
          require('./models/user');
          //add more model references here
      
          //This is just to make referencing the models easier within your apps, so you don't have to use strings. The model name you use here must match the name you used in the schema file
          this.models = {
              user: mongoose.model('User')
          }
      }
      
      var common = new Common();
      
      module.exports = common;
      
    5. commonを参照する プロジェクト -共有プロジェクトを参照する場合は、package.jsonに共有プロジェクトへの参照を追加します アプリ内でファイルを作成し、commonという名前を付けます 。個人的には、GitHubを使用してプロジェクトを保存し、リポジトリパスを参照しました。私のリポジトリはプライベートだったので、パスでキーを使用する必要がありました。これはGitHubサポートサイトで説明されています。
    6. アプリでモデルを初期化します -アプリの開始スクリプト(app.jsであると想定します) この例の場合)commonへの参照を追加します プロジェクトしてinitを呼び出します mongodbサーバーに接続してモデルを登録する方法。

      //at the top, near your other module dependencies
      var mongoose = require('mongoose')
        , common = require('common');
      
      common.init(mongoose);
      
    7. アプリの任意の場所でモデルを使用する -マングースが接続プールを確立し、モデルが登録されたので、アプリ内の任意のクラスのモデルを使用できます。たとえば、userに関する情報を表示するページがあるとします。 あなたはこのようにそれを行うことができます(テストされていないコード、例のためにこれを書いただけです):

      var common = require('common');
      
      app.get('/user-profile/:id', function(req, res) {
          common.models.user.findById(req.params.id, function(err, user) {
               if (err)
                   console.log(err.message); //do something else to handle the error
               else
                   res.render('user-profile', {model: {user: user}});
          });
      });
      

    編集 申し訳ありませんが、あるスキーマを別のスキーマから継承している行が表示されませんでした。他の回答の1つが述べているように、マングースはすでにpluginの概念を提供しています 。上記の例では、次のようにします。

    共通モジュールの「/models/base-profile-plugin.js」

    module.exports = exports = function baseProfilePlugin(schema, options){
    
        //These paths will be added to any schema that uses this plugin
        schema.add({
            _user: {type: Schema.Types.ObjectId, ref: 'User', required: true},
            name: {type: String, required: true},
            bio: {type: String, required: true},
            pictureLink: String
        });
    
        //you can also add static or instance methods or shared getter/setter handling logic here. See the plugin documentation on the mongoose website.
    }
    

    共通モジュールの「/models/entrepreneur.js

    var mongoose    = require('mongoose')
      , basePlugin  = require('./base-profile-plugin.js');
    
    var entrepreneurSchema   = new mongoose.Schema({
        mentors: {type: Schema.Types.ObjectId, ref: 'Mentor'}
    });
    
    entrepreneurSchema.plugin(basePlugin);
    
    module.exports = mongoose.model('Entrepreneur', entrepreneurSchema);
    


    1. PHPのmongo検索フィールドはで始まります

    2. SpringデータMongoDbでネストされたVariableOperators.mapItemsOfを使用できません

    3. mongodbの配列から最小値と最大値を見つけます

    4. 既存のMongoDB文字列属性をBSON::ObjectIdに変換します