Mongoose判别器,实例化文档。

3
我们正在使用继承模式的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中是否存在一个现有的函数,可以通过查看所有已知的子模式,为给定的鉴别器键提供适当的模型?
1个回答

1

一个更好的实现方式是使用对象而不是 switch。

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);

太棒了。我不知道Mongoose#model可以用于获取一个模型。这似乎正是我正在寻找的!:) 我会尝试并回来的! - qqilihq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接