2016-11-16 6 views
0

モデルを2回連続して更新するのに問題があります。これは私の小さな、一般的な、更新ハンドラです:mongoの連続した更新を2回連続して行います

let updateHandler = function(prop, data, req, res, done) { 
    Ingredient.update({ name: req.body.ingredientName }, { 
     [prop]: data 
    }, function(err, raw) { 
     if (err) { 
      console.log(err); 
      res.send('/error'); 
     } else { 
      console.log(raw); 
      if(done) res.send('/ingredients'); 
     } 
    }) 
} 

そして、これらは私のコールです:私はupdateHandlerは少し奇妙である知っている、そしてあなた自身に尋ねるかもしれない

updateHandler('name', req.body.ingredientNewName, req, res, false); 
updateHandler('price', parseFloat(req.body.ingredientNewPrice), req, res, true); 

:「なぜ地球上あなたはこれをしていますか? "しかし、それはこの質問のポイントではありません。なぜこれが機能していないのか理解したい。

両方の更新プログラムを実行すると、最初の更新プログラムのみが実際にモデルを変更します。私はこれを返す:

私は両方の更新が起こるが、2番目の1は何も変更しないという事実を知っている。何でも奇妙のは作られている何も変更はありません最初のアップデートの場合、2回目の更新が動作し、修正を行っていることである:

{ ok: 1, nModified: 0, n: 1 } 
{ ok: 1, nModified: 1, n: 1 } 

が、私は本当にここで何が起こっているか理解したいです。私はそれが非合理的な問題かもしれないという気持ちがあるかもしれません。その場合、おそらく私は約束でこれを回避することができました。しかし、更新は実際に実行されているので、おそらくmongo/mongooseで何か?

+0

更新ステートメントの第2引数に '$ set'を使用できますか? – hyades

答えて

0

明らかではありませんか?

まずあなたがname: req.body.ingredientNameに基づいて作るコール、そしてあなたが最初の呼び出しで行うあなたがreq.body.ingredientNewName

すべての罰金に名前を変更し、

今再びあなたがname: req.body.ingredientNameを行うが、それにはない2番目の呼び出し最初のクエリで名前がreq.body.ingredientNewNameに変更されたため、何も見つかりません。何も検索されず、何も変更されません。

より良い構造が必要で、関数を介してクエリ{ name: req.body.ingredientName }を渡して、次回{name:req.body.req.body.ingredientNewName}を渡すときに最初に{name:req.body.ingredientName}を渡します。 }

これは簡単な解決策です。

+1

私を殺す......... – jgozal

関連する問題