3.x から 4.x への移行

Mongoose 3 から Mongoose 4 に移行する場合は、考慮すべき 後方非互換の変更 がいくつかあります。

findOneAndUpdate() の新しいフィールドはデフォルトで false

Mongoose の findOneAndUpdate()findOneAndRemove()findByIdAndUpdate()findByIdAndRemove() 関数は、MongoDB の findAndModify コマンド のラッパーにすぎません。MongoDB サーバーと MongoDB NodeJS ドライバーの両方が、new オプションをデフォルトで false に設定していますが、mongoose 3 ではこのデフォルトを上書きしていました。MongoDB サーバーのドキュメントとの一貫性を保つため、mongoose ではデフォルトで false が使用されます。つまり、findOneAndUpdate({}, { $set: { test: 1 } }, callback); は、$set 操作が適用される前のドキュメントを返します。

更新時に加えた変更を含むドキュメントを返すには、new: true オプションを使用します。

MyModel.findOneAndUpdate({}, { $set: { test: 1 } }, { new: true }, callback);

CastError と ValidationError は、kind を使用して type の代わりにエラーの種類をレポートするようになりました

Mongoose 3 では、CastError と ValidationError には type フィールドがありました。例えば、ユーザー定義のバリデーションエラーには、文字列 'user defined' が含まれる type プロパティがありました。Mongoose 4 では、V8 JavaScript エンジンが内部的に Error.type プロパティを使用しているため、このプロパティは kind に名前変更されました。

クエリに .then() 関数があるようになりました

mongoose 3 では、MyModel.find().exec().then(); のように、クエリチェーンに .exec() を呼び出して約束を取り出す必要がありました。Mongoose 4 のクエリは約束であるため、代わりに MyModel.find().then() を実行できます。Q.ninvoke() のような関数を 使用している場合や、mongoose クエリを約束から返している場合は注意してください。

詳細情報

関連するブログ記事