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); }
我怎样才能保证:
-
每当一个新的对象从数据库(mongoose init )“水合”,我将有一个Polygon实例,而不是一个普通的对象。 我明白它会使用
cast
function。assert(model.polygon instanceof Polygon)
-
每次我将保存我的模型时,Polygon属性应该被编码并存储为普通对象表示(
Polygon.prototype.toObject()
),在这种情况下,它是mongodb中的Array
对象。 - 如果我使用
model.toObject()
,它将recursion地调用model.polygon.toObject()
以获得文档的完整普通对象表示。
我在github.com上find了一个解决scheme,感谢@ vkarpov15 :
-
需要
SchemaType.prototype.cast()
来正确地从原始 mongodb表示中提取文档模型,并且在无效数据的情况下抛出错误。 -
为了定制mongodb持久性,我必须在自定义types对象原型(即
Polygon
)中实现toBSON()
函数。 -
model.toObject()
/model.toJSON()
当前不会在所有子toObject()
recursion调用toObject()
/toJSON()
,但是看起来它将会被修复 。 但我可以重载它作为临时解决方法分配一个自定义的schema.methods.toObject()
实例方法。