Mongoose の Lodash 使用

ほとんどの場合において、Mongoose は Lodash とうまく連携します。ただし、覚えておくべき注意点がいくつかあります。

cloneDeep()

Mongoose オブジェクトには Lodash の cloneDeep() 関数 を使用しないでください。これには 接続モデルクラス、および クエリ が含まれますが、特に ドキュメント には重要です。たとえば、以下のようなことを試したくなる可能性があります。

const _ = require('lodash');

const doc = await MyModel.findOne();

const newDoc = _.cloneDeep(doc);
newDoc.myProperty = 'test';
await newDoc.save();

ただし、MyModel に配列プロパティが含まれている場合、上記のコードは次のエラーをスローします。

TypeError: this.__parentArray.$path は定義されていません

これは、Lodash の cloneDeep() 関数が プロキシを処理しないためで、Mongoose 6 から Mongoose 配列はプロキシになります。通常、Mongoose ドキュメントをディープクローンする必要はありませんが、必要な場合は cloneDeep() の代替として以下を使用します。

const doc = await MyModel.findOne();

const newDoc = new MyModel().init(doc.toObject());
newDoc.myProperty = 'test';
await newDoc.save();