Mongoose 高级自定义模式对象类型
Posted
技术标签:
【中文标题】Mongoose 高级自定义模式对象类型【英文标题】:Mongoose advanced custom schema object type 【发布时间】:2016-10-31 21:06:15 【问题描述】:我在 Mongoose >=4.4 中找不到任何涉及自定义对象(或 value-objects)的高级 custom schema type 示例。
假设我想使用自定义类型,例如:
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);
我如何保证:
每次从 db (mongoose init) 中“水合”一个新对象时,我都会有一个 Polygon
实例而不是普通对象。我知道它将使用cast
功能。 assert(model.polygon instanceof Polygon)
每次我保存模型时,多边形属性都应该是
编码并存储为普通对象表示
(Polygon.prototype.toObject()
) 在这种情况下是 mongodb 中的 Array
对象。
model.toObject()
,它将递归调用 model.polygon.toObject()
以获得文档的完整纯对象表示。
【问题讨论】:
【参考方案1】:感谢github.com上的@vkarpov15,我找到了解决方案:
SchemaType.prototype.cast()
需要从 raw mongodb 表示中正确水合文档模型,并在数据无效的情况下抛出错误。
要自定义 mongodb 持久性,我必须在我的自定义类型对象原型(即 Polygon
)中实现 toBSON()
函数。
model.toObject()
/ model.toJSON()
目前不会在所有子节点上递归调用 toObject()
/toJSON()
,但看起来它将是 fixed。但我可以将其作为临时解决方法重载,分配自定义 schema.methods.toObject()
实例方法。
【讨论】:
以上是关于Mongoose 高级自定义模式对象类型的主要内容,如果未能解决你的问题,请参考以下文章