[英]How to reformat data only for saving to MongoDB with Mongoose to avoid “not okForStorage”?
我在Mongoose中定義了Schema,我剛剛意識到一個屬性被保存為對象(某種哈希),但是它的鍵中可以包含禁止的字符。 禁止是指那些MongoDB不太喜歡的東西, not okForStorage
引起not okForStorage
錯誤:點,美元符號等。
因為我不想更改所有應用程序,所以我想在模型上定義一些東西,以便在將對象傳遞給MongoDB之前將其重新格式化為數組,當然,當從MongoDB加載此類數據時,我還需要重新格式化它。
我嘗試了getter和setter方法,並在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'}
});
問題是:我應該將我的兩個魔術函數toMongo
和fromMongo
以便該接口完全像示例中所示的那樣工作?
(免責聲明:在提出此問題時,我是Mongoose&Node.js新手,所以即使是愚蠢的細節也可能對我有幫助)
我想我自己找到了答案。 可以通過中間件來解決,方法是:
schema.post('init', function (doc) {
doc.mapping = fromMongo(doc.mapping);
}
schema.pre('save', function (next) {
this.mapping = toMongo(this.mapping);
next();
}
這樣,它就與應用程序的其余部分完全隔離了,到目前為止,我對該解決方案沒有任何問題。 如果出現任何問題,我將嘗試不斷更新此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.