Mongoose高级自定义模式对象types

在Mongoose> = 4.4中,找不到涉及自定义对象(或值对象 )的高级 自定义模式types的任何示例。

想象一下,我想要使用一个自定义types,如:

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. 每当一个新的对象从数据库(mongoose init )“水合”,我将有一个Polygon实例,而不是一个普通的对象。 我明白它会使用castfunction。 assert(model.polygon instanceof Polygon)

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

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

我在github.com上find了一个解决scheme,感谢@ vkarpov15 :

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

  2. 为了定制mongodb持久性,我必须在自定义types对象原型(即Polygon )中实现toBSON()函数。

  3. model.toObject() / model.toJSON()当前不会在所有子toObject()recursion调用toObject() / toJSON() ,但是看起来它将会被修复 。 但我可以重载它作为临时解决方法分配一个自定义的schema.methods.toObject()实例方法。