2016-10-25 2 views
2

私たちはdocumentationに従って実装したMongooseの弁別機能を継承したスキーマを使用しています。Mongoose discriminators、instantiate documents

私たちは、REST APIを通じて異なるタイプのドキュメントをPOSTにして、共通のコントローラ機能でロジックを処理したいと考えています。仮定

は、我々はスーパータイプGenericEvent、またはサブタイプClickedLinkEvent、又はSignedUpEventのいずれかとすることができる文書を作成するためのRESTの方法を持っている(上記のリンクドキュメントの例に従うこと)。新しいモデルタイプが追加されるたびに手動でgetMongooseModel機能をキュレートすること

var GenericEventModel = require('GenericEventModel'); 
var ClickedLinkEventModel = require('ClickedLinkEvent'); 
var SignedUpEventModel = require('SignedUpEvent'); 

// REST logic for creating a document of a specific type 
module.exports.createEvent = function(req, res, next) { 
    var modelType = req.params.type; // as provided via REST parameter 
    var Model = getModel(modelType); // get the appropriate model type 
    new Model(req.body).save(next); 
} 

// TODO want to avoid this 
function getMongooseModel(type) { 
    switch (modelType) { 
    case 'GenericEvent': return GenericEventModel; 
    case 'ClickedLinkEvent': return ClickedLinkEventModel; 
    case 'SignedUpEvent': return SignedUpEventModel; 
    // and many more, needs to be extended, every time a new type is added … 
    } 
} 

ではなくエラーが発生しやすいようだ、と私はコードに作業する他の人がする疑いがある:私は現在やっていることのようなものです単にそれを忘れる。

私の質問:既存のすべての既知のサブスキーマを見て、指定された識別子のキーに適切なモデルを与えることができるMongoose APIの既存の関数がありますか?

答えて

1

より良い実装では、スイッチの代わりにオブジェクトを使用する必要があります。その後

var modelMap = { 
    'GenericEvent': GenericEventModel, 
    'ClickedLinkEvent': ClickedLinkEventModel, 
    'SignedUpEvent': SignedUpEventModel 
}; 

function getMongooseModel(type) { 
    return modelList[type]; 
} 

エラーを回避するために、あなたはmodelMapオブジェクトを移入するためにMongoose#plugin(fn, [opts])を使用することができます。

また、Mongoose#model(name, [schema], [collection], [skipInit])を使用することもできます。

モデルを定義するか、またはモデルを取得します。このような

何かが動作するはずです:

module.exports.createEvent = function(req, res, next) { 
    var Model = mongoose.model(req.params.type); 
    (new Model(req.body)).save(next); 
} 

マングースでモデルクラスの適切な宣言で、モデル名はもちろん、あなたのリクエストパラメータと一致する必要があります。

var GenericEventModel = mongoose.model('GenericEvent', GenericEventModelSchema); 
+0

驚くばかりです。モンゴース#モデルが**モデルを入手するのに使用できることは知らなかった。これはまさに私が探しているものと思われます! :)私はやってみよう! – qqilihq

+0

完璧な作品です、ありがとうございました! – qqilihq