Mongoose高级自定义架构对象类型

时间:2016-06-29 08:58:51

标签: node.js mongodb mongoose mongoose-schema mongoose-plugins

我在Mongoose> = 4.4中找不到涉及自定义对象(或custom schema type)的高级 value-objects的示例。

想象一下,我想使用自定义类型:

function Polygon(c) {
  this.bounds = [ /* some data */ ];
  this.npoints = /* ... */
  /* ... initialize polygon ... */
};

Polygon.prototype.area = function surfaceArea() { /**/ };

Polygon.prototype.toObject = function toObject() { return this.bounds; };

接下来,我实现了一个自定义SchemaType,如:

function PolygonType(key, options) {
  mongoose.SchemaType.call(this, key, options, 'PolygonType');
}

PolygonType.prototype = Object.create(mongoose.SchemaType.prototype);

PolygonType.prototype.cast = function(val) {
  if (!val) return null;
  if (val instanceof Polygon) return val;
  return new Polygon(val)
}

PolygonType.prototype.default = function(val) {
  return new Polygon(val);
}

我如何保证:

  1. 每当一个新对象从db(mongoose init )“水合”时,我会有一个多边形 实例而不是普通对象。我知道它会使用cast 功能。 assert(model.polygon instanceof Polygon)

  2. 每次我保存我的模型时,Polygon属性都应该是 编码并存储为普通对象表示 (Polygon.prototype.toObject())在这种情况下是mongodb中的 Array 对象。

  3. 如果我使用model.toObject(),它将以递归方式调用model.polygon.toObject()以获得文档的完整普通对象表示。

1 个答案:

答案 0 :(得分:2)

感谢@ {3}}上的@ vkarpov15找到了解决方案:

  1. SchemaType.prototype.cast()需要从原始 mongodb表示中正确水合文档模型,并在数据无效的情况下抛出错误。

  2. 要自定义mongodb持久性,我必须在自定义类型对象原型中实现github.com函数(即Polygon)。

  3. model.toObject() / model.toJSON()目前没有对所有孩子进行递归toObject() / toJSON(),但看起来会toBSON() 。但我可以将其作为临时解决方法重载,分配自定义schema.methods.toObject()实例方法。

相关问题