2

私はnodejsが初めてです。私はマングースとユーザーログインを備えたアプリケーションを持っています。mongoDB のコレクションには、すべてのユーザー向けのものと、すべてのユーザーが自分の顧客のコレクションを持つように個別の顧客コレクションなどがあります。ユーザーがログインして jwt-token を取得すると、個々のマングース モデルがインスタンス化されます。

var models = require('../models')(userID);

フォルダー /models に index.js があります。

var Customer = require('./customermodel'); 

module.exports = function (userID) {
   Customer(userID) 
}

ファイル /models/customermodel.js:

var mongooseCustomer = function(userID) {
    var schema = mongoose.Schema({
          _id: { type: Number},
          Name:  { type: String },
          Address:  { type: String },
        }, {collection: userID + 'userID'})
        return mongoose.model(userID + 'customer', schema);
}
Module.exports = mongooseCustomer;

この問題は、顧客が 2 つの異なるブラウザーからログインし、次のエラーを返した場合に発生します:123customerコンパイル後にモデルを上書きすることはできません。変更して問題を解決しました:

var models = require('../models')(userID);

に:

try {
     var models = require('../models')(userID);
     console.log('Schema was created');
}
catch (err) {
     console.log('User is already logged in');
}

ここで私の質問は、セットアップ全体が複雑すぎて、動的な方法でモデルを作成するためのよりクリーンな方法があるかどうかです。

4

1 に答える 1

6

ユーザー向けにコレクションを動的に作成することに本当に固執したい場合はtry{ } catch(err)、ユーザー向けにコンパイルされたモデルが既に存在する場合に mongoose にクエリを実行するよりも良い方法です。このmongoose.model関数を使用して、モデルを定義および取得できます。

var mongooseCustomer = function(userID) {
  var model = mongoose.model(userID + 'customer');

  if (!model) {
    var schema = mongoose.Schema({
      _id: { type: Number},
      Name:  { type: String },
      Address:  { type: String },
    }, {collection: userID + 'userID'});

    model = mongoose.model(userID + 'customer', schema);
  }

  return model;
};

Module.exports = mongooseCustomer;

mongoose は 1000 番目のモデルを処理するように構築されておらず、ほとんどのデータベースと同様に Mongodb には最大コレクション制限があるため、すべてのユーザーのコレクションを動的に作成するアプローチはスケーリングされないことが予想されます。

私見より良いアプローチは、コレクションで識別子を使用してテナントを識別し、db レイヤーを公開してテナントを透過的に処理することです。

最小限のデータ層を公開するモデル node.js モジュールを定義しましょう

// First define the schema and model
var customerSchema = mongoose.Schema({
    _id: { type: Number},
    // Additional tenant discriminator
    userID: { type: Number, required: true }, 
    Name:  { type: String },
    Address:  { type: String },
  });

var customerModel = mongoose.model('customer', schema);

module.exports = function(userID) {
  return {
    customer: {
      find: function(query, callback) {
        query.userID = userID;
        customerModel.find(query, callback);
      },

      findOne: function(callback) {
        var query = { userID : userID };
        customerModel.findOne(query, callback);
      }
    }
  }
}

この最小限のレイヤーを使用する場合、ユーザー ID が常に Mongodb 関数に追加されるようにしました。

var models = require('../models')(123124432);

models.customer.findOne(...);

また、mongooseの上に独自のデータ層を定義する代わりに、透過的な方法でマルチテナントを処理する mongoose ミドルウェア ( http://mongoosejs.com/docs/middleware.html ) を使用することもできます。

于 2016-01-19T09:10:24.033 に答える