[英]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.