node.js将自定义对象序列化/反序列化为mongodb

时间:2017-05-26 08:30:30

标签: node.js mongodb serialization ecmascript-6

我有以下架构:

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
}

因为你可以想象,从保存的对象和新数据的创建是不一样的。

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

1 个答案:

答案 0 :(得分:1)

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

  • 你有mongo的收藏基础,字段类型,指定foo或bar实例
  • 在base
  • 中实现deserialize方法
  • 在每个子类中实现serialize方法
  • 在拥有基础对象数组时使用您的方法

我会修改基类:

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