Dar*_*rio 7 mongoose mongodb node.js mongoose-plugins mongoose-schema
我在Mongoose> = 4.4中找不到任何涉及自定义对象(或值对象)的高级 自定义模式类型的示例.
想象一下,我想使用自定义类型,如:
function Polygon(c) {
this.bounds = [ /* some data */ ];
this.npoints = /* ... */
/* ... initialize polygon ... */
};
Polygon.prototype.area = function surfaceArea() { /**/ };
Polygon.prototype.toObject = function toObject() { return this.bounds; };
Run Code Online (Sandbox Code Playgroud)
接下来,我实现了一个自定义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);
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能保证:
每当一个新对象从db(mongoose init)"水合"时,我将拥有一个Polygon实例,而不是一个普通对象.我明白它会使用这个cast
功能.assert(model.polygon instanceof Polygon)
每次我保存我的模型时,Polygon属性应该被编码并存储为普通对象表示(Polygon.prototype.toObject()),在这种情况下是Arraymongodb中的对象.
model.toObject()它将递归调用model.polygon.toObject()to具有文档的完整普通对象表示.感谢github.com上的@vkarpov15,我找到了一个解决方案:
SchemaType.prototype.cast()需要从原始mongodb 表示中正确地水合文档模型,并在数据无效的情况下抛出错误。
为了自定义 mongodb 持久性,我必须toBSON()在自定义类型对象原型(即Polygon)中实现一个函数。
model.toObject()/model.toJSON()当前不会对所有子级递归调用toObject()/ toJSON(),但看起来它将被修复。但我可以重载它作为分配自定义schema.methods.toObject()实例方法的临时解决方法。
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |