2012-05-18 3 views
0

schema.pre('save',function(..){...})의 비즈니스 로직을 기반으로 특정 필드에 스키마를 동적으로 연결하고 싶습니다. 가능하다면 어떻게해야합니까? 동적으로 유효성을 검사하기 위해 스키마를 동적으로 첨부합니다

일부 (간체) 스키마와 배경 :.

var fact= new Schema({ 
    name: { type: String, required: true, index: { unique: false }} 
    ,value: {type: {}, required: true} 
    ,moreinfodesc: { type: String, required: false} 
    ,createddate : { type: Date, required: true, default: Date.now, select: false } } 
}, { collection: 'Fact' }); 

var factSchema= new Schema({ 
    name: { type: String, required: true, index: { unique: true }} 
    , valueType: { type: {}, required: true}           
    ,isMulti: {type: Boolean, required: true } 

    //ACL-stuff 
    ,directChangeRoles: {type: [String]} //i.e: [super, admin,owner] 
    ,suggestChangeRoles: {type: [String]} //ie: [editor] 
    ,enum: {type: [{}]} 
    ,mixins: {type: [String]} 
}, { collection: 'FactSchema' }); 

이 편집 할 엔티티 ''특정의 ''사실 수 있도록 단순화 된 구조

e.g: entityA.facts=[fact] 

로 볼 수 있습니다 스키마의 fact.value에서 mongoose와 관련된 모든 유형을 가질 수 있습니다. 그러나 런타임에이를 FactSchema.valueType ("부울", "문자열"또는 " 태그]). 이것은 모두 성가신 것처럼 보일지 모르지만 이것은 내가 여러 가지 이유로 가고 싶습니다.

fact.name=tags과 같은 특정 사실에 대해 fact.value 유형에 [Tag]을 런타임에 할당한다고 가정 해 보겠습니다. 이를 위해 평범한 것처럼 유효성 검사를 사용하여 Tag -schema를 설정하고 fact.value의 유효성을 검사해야합니다.

내가 fact.pre('save',function(..){.. //validation here })fact.value에 어떻게 든 "연결"는 [Tag] -schema의 생각과 fact.value가 디자인 타임이 아닌 런타임에 유형 [Tag] 할당 된 것처럼 희망 검증 마술이 일어날 것입니다.

마지막으로 질문 : '첨부'가 가능한지 전혀 알 수 없습니다. 그렇다면 어떻게해야합니까?

감사합니다.

답변

1

런타임에 "연결"을 할 수 없습니다하지만 당신은 현재 문서 상태에 경로에 사용자 정의 유효성 검사기를 추가하고 논리를 기본으로 할 수

https://gist.github.com/2789681

+0

감사합니다 아론, 몽구스가 좋은 물건입니다! 그 동안 몽구스의 'on-the-fly'스키마를 사용하여 해결책을 찾았습니다. 나는'fact.save'를 호출하기 전에'fact.set ('value', vals, multivalued? [onTheFlySchema] : onTheFlySchema);와 같은 것을 호출합니다. 이것은'onTheFlySchema'에서 모든 유효성 검사, 후크 설정을 포함하여 훌륭하게 작동합니다. 제안 : 'on-the-fly'스키마를 좀 더 광고하고 싶을 수도 있습니다. :) –

관련 문제