gpt4 book ai didi

Node.js 将自定义对象序列化/反序列化到 mongodb

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:07 25 4
gpt4 key购买 nike

我有以下架构:

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
}

因为正如您可以想象的那样,从已保存的对象创建和从新数据创建是不一样的。

有人知道实现这些操作的不太棘手的方法吗?

最佳答案

在 Mongoose 中,这些事情很容易完成。但只要你不这样做,我可以建议你这样的流程:

  • 您在 mongo 中有一个集合库,其字段类型指定 foo 或 bar 实例
  • 在基础中实现反序列化方法
  • 在每个子类中实现序列化方法
  • 当拥有基础对象数组时,您可以使用您的方法

我会修改基类:

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);
}
}

然后,假设您有基础对象数组,您可以轻松映射它们:

const mongoBaseModels = baseObjects.map(el => el.serialize(el))

关于Node.js 将自定义对象序列化/反序列化到 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44197009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com