2016-10-25 12 views
2

우리는 documentation에 따라 구현 한 몽구스의 판별 기능을 가진 상속 된 스키마를 사용하고 있습니다.몽구스 판별 자, 문서 인스턴스화

우리는 REST API를 통해 서로 다른 유형의 문서를 POST 문서로 만들고 공통 컨트롤러 기능으로 논리를 처리하려고합니다. 가정하자

, 우리는 슈퍼 타입 GenericEvent 또는 서브 타입 ClickedLinkEvent 또는 SignedUpEvent 중 하나 일 수있는 문서를 생성하는 REST 방법이 (상기 링크 된 문서의 예를 수행하기 위해). 내가 현재하고 있어요 것은 같은 :

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 기능을 보좌 신부을 갖는 것 단순히 잊어 버려.

그럼, 내 질문 : 모든 알려진 된 하위 스키마를보고 주어진 discriminator 키에 대한 적절한 모델을 줄 수있는 몽구스 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