2016-08-10 2 views
0

Mongoose 스키마의 필드에 추가/사용자 지정 특성을 추가 할 수 있습니까? 예를 들어, 다음 필드에 name: 속성을 참고 :Mongoose 스키마 필드에 추가 속성이 있습니까?

var schema = mongoose.Schema({ 

    _id : { type: String, default: $.uuid.init }, 

    n : { type: String, trim: true, name: 'name' }, 

    ac : { type: Date, required: true, name: 'created' }, 
    au : { type: Date, name: 'updated' }, 
    ad : { type: Date, name: 'deleted' }, 
    am : { type: String, ref: 'Member', required: true, name: 'member' } 
}); 

우리는 우리의 시스템에서 문서의 수가 많은 기대와 가능한 한 많은 공간을 절약하고 싶습니다. 이 예에서는 필드의 이름을 축약했습니다 (nname 등). 페치 후에 추가 name 필드를 사용하여 JSON 객체를 수화하는 것이 좋습니다.

+0

몽구스에서 "수화"는 일반적인 JS 개체에서 몽구스 문서를 만드는 것을 의미하지만 다른 방법으로 원한다면 (몽구스 문서에서 'n'이 '이름'으로 매핑되는) JS 개체를 만듭니다. – robertklep

+0

수정하십시오. 일단 문서가 DB에서 추출되면 JS 객체로 변환하여 전달합니다 (redis 등으로 지속). –

답변

0

당신은 인스턴스 메소드 만들 수 (나는 toMappedObject라고,하지만 당신은 그러나 당신이 좋아하는 그 이름도 자유롭게) 그것은 name 속성이 있는지 확인하기 위해 각 필드에 대한 스키마를 확인하여 변환을 수행 할 수있는 :

그것이 (내가 아주 잘 테스트하지 않은) 경우의 문제에 팝업을 간과 훨씬 더 암시 너무 쉽게하지만
schema.methods.toMappedObject = function() { 
    let obj = this.toObject(); 

    Object.keys(obj).forEach(fieldName => { 
    let field = schema.tree[fieldName]; 
    if (field.name) { 
     obj[field.name] = obj[fieldName]; 
     delete obj[fieldName]; 
    } 
    }); 

    return obj; 
} 

// Example usage: 
let doc = new Model({...}); 
let obj = doc.toMappedObject(); 

양자 택일로, 당신은 자동으로 toJSON에 의해 생성 된 출력을 변환하는 스키마를 구성 할 수 있습니다

schema.set('toJSON', { 
    transform : function(doc, obj) { 
    Object.keys(obj).forEach(fieldName => { 
     let field = doc.schema.tree[fieldName]; 
     if (field.name) { 
     obj[field.name] = obj[fieldName]; 
     delete obj[fieldName]; 
     } 
    }); 

    return obj; 
    } 
}); 

// Example usage: 
let doc = new Model({...}); 
console.log('%j', doc); // will call `doc.toJSON()` implicitly 
관련 문제