このように書くことはしませんが、コードが失敗する理由を説明します。
問題は$setブロックです
渡された更新オブジェクトに値を具体的に設定することを選択しています。値がundefined
の場合 あなたはmongoにそれをnull
に設定するように強制しています 。
これが問題です
たとえば、DBの場合:
{
"_id" : ObjectId("ns8f9yyuo32hru0fu23oh"),
"name" : "firstTest",
"nickname": "jack",
"__v" : 0
}
testToUpdate = { name: 'foo' }
を渡した場合 最終的には
Test.update({ ... }, { $set: { name: 'foo', nickname: undefined }}
updatedValues.nickname
を取得しているため 引数から外れ、それは定義されていません
欲しい
Test.update({ ... }, { $set: updatedValues }
これは
に翻訳されますTest.update({ ... }, { $set: { name: 'foo' } }
ニックネームのキーを提供しなくなったため、undefined/nullに設定されていません。
私はマングースプラグインを使用し、フィールドをモデルに手動で渡すことを心配しません( github.com/autolotto/mongoose-model-update )
- 更新可能なフィールドを定義してから、
model.update(req.body)
を実行するだけです。 このすべてについて心配する必要はありません - プラグインを使用したくない場合でも、
Test.findByIdAndUpdate(id, { name, nickname }, callback)
を実行できます。