2014-06-09 1 views
0

나는 Mongoose에서 정의 된 스키마를 가지고 있으며 하나의 속성이 객체 (해시의 종류)로 저장되고 있음을 알았지 만, 금지 된 문자를 키에 포함 할 수 있습니다. 금지 된 의미는 MongoDB가별로 좋아하지 않아서 도트, 달러 기호 등 not okForStorage 오류가 발생하는 것을 의미합니다."okForStorage가 아닌"것을 피하기 위해 Mongoose를 사용하여 MongoDB에 저장하기 위해 데이터를 다시 포맷하는 방법은 무엇입니까?

내 응용 프로그램을 모두 변경하고 싶지는 않지만 내 모델에 무언가를 정의하고 싶습니다. MongoDB에 전달하기 전에 객체를 배열로 다시 포맷하며 물론 MongoDB에서 이러한 데이터를로드 할 때 객체를 다시 포맷해야합니다.

나는 getters와 setters를 시도하고 Middleware으로 잠시 재생했지만 제대로 작동하지 못했습니다. 이것에 대한 모범 사례가 있습니까? 최선의 접근 방법은 무엇입니까? 정말 어딘가에 스키마에 어딘가에 두 가지 기능을 스틱 수 있고 그것은 내 애플 리케이션의 나머지 부분에 대한 순수 블랙 박스 것입니다.

업데이트 : (예)를 달성하려면 무엇 :

toMongo = function (mapping) { 
    // from {'k': 'v', ...} makes [{key: 'k', value: 'v'}, ...] 
    return ... 
} 

fromMongo = function (mapping) { 
    // from [{key: 'k', value: 'v'}, ...] makes {'k': 'v', ...} 
    return ... 
} 

schema = mongoose.Schema({ 
    mapping: mongoose.Schema.Types.Mixed 
}); 

var Foo = mongoose.model('Foo', schema); 
var foo = new Foo({ mapping: {'tricky.key': 'yes', 'another$key': 'no'} }); 

foo.mapping // results in {'tricky.key': 'yes', 'another$key': 'no'} 

foo.save(function(err, doc) { 
    // mapping is actually saved as 
    // [{key: 'tricky.key', value: 'yes'}, {key: 'another$key', value: 'no'}] in mongo! 

    doc.mapping // results in {'tricky.key': 'yes', 'another$key': 'no'} 
}); 

Foo.find(function (err, foos) { 
    foos[0].mapping // results in {'tricky.key': 'yes', 'another$key': 'no'} 
}); 

질문은 : 나는 예와 같이 내가이 개 마법 기능 toMongofromMongo 그래서 인터페이스가 정확하게 작동 후크해야 어디?

(면책 조항 :이 질문의 시간이 요구되고, 나는이 몽구스 & Node.js를의 멍청한 놈, 그래서 심지어 바보 세부 사항이 나에게 도움이 될 수있는) 내가 답을 찾을 자신을 생각

+0

모델의 문서 인스턴스에 값을 전달하기 전에 여기에서 값을 "미리 구문 분석"할 수 있습니다. 당신은 거기에있는 잘못된 문자의 종류에 좀 더 구체적 일 수 있습니다. 확실하게'$'와'.'는 당연합니다. 그러나 당신의 질문은 당신이하려고하는 것의 표본으로부터 유익을 얻을 것입니다. –

+0

제 질문을 더 명확하게하기 위해 예제를 추가했습니다. –

답변

0

. 그것은 Middlewares으로이 방법으로 해결할 수 있습니다

schema.post('init', function (doc) { 
    doc.mapping = fromMongo(doc.mapping); 
} 

schema.pre('save', function (next) { 
    this.mapping = toMongo(this.mapping); 
    next(); 
} 

꽤 응용 프로그램의 나머지 부분에서 고립되어 지금까지 나는이 솔루션에 문제가 없었 이런 식으로. 문제가 발생할 경우를 대비하여이 답변을 계속 업데이트하려고 노력할 것입니다.

관련 문제