我有以下架构:
class Base {
constructor(initObj) { /* some init */}
// some methods
}
class Foo extends Base {
constructor(initObj) { super(initObj); }
// some methods
}
class Bar extends Base {
constructor(initObj) { super(initObj); }
// some methods
}
如何将Base
数组序列化/反序列化为mongodb?
目前,我在每个对象上保存了一个属性type
,以确定它是Foo
还是Bar
以及我的Foo和Bar的构造函数是这样的:
constructor(initObj) {
super(initObj);
if (initObj.fromMongo) this.restore(initObj)
else this.initialize(initObj)
this.type = 'bar'; // or baz according to the object
}
因为你可以想象,从保存的对象和新数据的创建是不一样的。
有人知道实现这些操作的方法不那么棘手吗?
答案 0 :(得分:1)
在猫鼬中,这些事情很容易完成。但就你不这样做,我可以建议你这样的流程:
我会修改基类:
class Base {
constructor(initObj) { /* some init */}
serialize(model) {
throw new Error('not implemented')
}
deserialize(mongoModel) {
// very rude, just to catch the point
// most probably, you'll have to map object before creating new instance
if (mongoModel.type === 'Foo') return new Foo(mongoModel);
else return new Bar(mongoModel);
}
}
我会写出这些方法的近似实现:
class Foo extends Base {
constructor(initObj) { super(initObj); }
serialize(model) {
// again very rude, it dependes on your logic
return JSON.stringify(model);
}
}
然后,假设您有Base对象数组,您可以轻松映射它们:
const mongoBaseModels = baseObjects.map(el => el.serialize(el))