繁体   English   中英

Mongoose鉴别器,实例化文件

[英]Mongoose discriminators, instantiate documents

我们使用继承的模式和Mongoose的鉴别器功能,我们根据文档实现了这些功能。

通过我们的REST API,我们希望POST不同类型的文档,并使用通用控制器功能处理逻辑。

假设,我们有一个用于创建文档的REST方法,该方法可以是超类型GenericEvent ,也可以是子类型ClickedLinkEventSignedUpEvent (以跟随上面链接的文档中的示例)。 我目前正在做的是:

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 …
  }
}

每当添加新的模型类型时,必须手动策划getMongooseModel函数似乎容易出错,我怀疑其他将要编写代码的人会忘记它。

那么,我的问题是:Mongoose API中是否存在一个函数,通过查看所有已知的子模式,可以为给定的鉴别器密钥提供适当的模型?

更好的实现应该是使用对象而不是开关。

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

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

之后为了避免错误,您可以使用Mongoose#plugin(fn,[opts])来填充modelMap对象。

或者你可以使用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);
}

通过在mongoose中正确声明模型类,模型名称必须与您的请求参数匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM