カスタムキャスティング

Mongoose 5.4.0で、SchemaTypeをグローバルに設定するいくつかの方法が導入されました。これらの新機能の1つがSchemaType.cast() 関数です。これにより、Mongooseの組み込みキャスティングを上書きできます。

たとえば、デフォルトでは、日本語の数字を含む文字列を数値に変換しようとすると、Mongooseはエラーをスローします。

const schema = new mongoose.Schema({
  age: Number
});
const Model = mongoose.model('Test', schema);

const doc = new Model({ age: '二' });
const err = doc.validateSync();
// "Cast to Number failed for value "二" at path "age""
err.message;

日本語の数字「2」を含む文字列の数値への変換を許可するには、数値のデフォルトのキャスティング関数を以下に示すように上書きできます。

// Calling `cast()` on a class that inherits from `SchemaType` returns the
// current casting function.
const originalCast = mongoose.Number.cast();

// Calling `cast()` with a function sets the current function used to
// cast a given schema type, in this cast Numbers.
mongoose.Number.cast(v => {
  if (v === '二') {
    return 2;
  }
  return originalCast(v);
});

const schema = new mongoose.Schema({
  age: Number
});

const Model = mongoose.model('Test', schema);

const doc = new Model({ age: '二' });
const err = doc.validateSync();
err; // null
doc.age; // 2