7

Mongoose >=4.4 では、カスタム オブジェクト (または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 )から「ハイドレート」されるたびに、単純なオブジェクトではなく Polygon インスタンスが作成されます。関数を使用することを理解していcast ます。assert(model.polygon instanceof Polygon)

  2. モデルを保存するたびに、Polygon 属性をエンコードPolygon.prototype.toObject()し、この場合はArraymongodb のオブジェクトであるプレーン オブジェクト表現 ( ) として保存する必要があります。

  3. これを使用model.toObject()すると、 を再帰的に呼び出してmodel.polygon.toObject()、ドキュメントの完全なプレーン オブジェクト表現を取得します。
4

1 に答える 1

2

github.com の @ vkarpov15のおかげで解決策を見つけました。

  1. SchemaType.prototype.cast()生のmongodb表現からドキュメントモデルを正しくハイドレートし、無効なデータの場合にエラーをスローするために必要です。

  2. mongodb の永続性をカスタマイズするtoBSON()には、カスタム型オブジェクト プロトタイプ (つまりPolygon) に関数を実装する必要がありました。

  3. model.toObject()/現在、すべての子に対して/をmodel.toJSON()再帰的に呼び出しているわけではありませんが、修正されるようです。しかし、カスタムインスタンス メソッドを割り当てる一時的な回避策として、それをオーバーロードすることができます。toObject()toJSON()schema.methods.toObject()

于 2016-08-01T12:13:20.520 に答える