2016-10-04 24 views
0

マングースドキュメントmentionこのサンプルコード:Mongoose update()は本当に何を更新しますか?

Tank.findById(id, function (err, tank) { 
    if (err) return handleError(err); 

    tank.size = 'large'; 
    tank.save(function (err, updatedTank) { 
    if (err) return handleError(err); 
    res.send(updatedTank); 
    }); 
}); 

がちょうどsize財産(すなわちdb.tanks.update({_id: tank._id}, {$set: {size: "large"}});)を設定MongoDBのupdate()コマンドにこの結果をいたり、これは、文書全体を交換するのですか?

findById()が返された直後、別のクライアントが別のプロパティ(たとえば、color)を更新すると、save()が実行される前にどうなりますか? colorは、以前の値に戻したか、そのまま保持していますか?

また、「変更された」プロパティのみを更新するにはスマートである場合、どのように正確に検出されますか(前後の値は比較されますか?またはtankオブジェクトのセッターを介して比較されますか?とにかくタンクsizeがすでに "大"だったらどうでしょうか?

Mongoose docsは、この上に非常に明確ではないと私はマングースはこの点でを使用することを意図し設計さであるかを理解したいと思いますので、私は聞いていますのよ。

+0

自分でテストするのは比較的簡単であるはずです。 – robertklep

+0

私はテストするデータベースを持っていません。また、テストでは、ライブラリが*想定していることを正確には明らかにしません。悪いテストは、誤った仮定につながる可能性があります。 –

+0

私はあなたがMongooseの開発者以外の誰かから、何が起こっているのかについての決定的な答えを得ているとは思っていません。通常のユーザーがここに投稿した回答は事例になります。 – robertklep

答えて

0

少しのテストでは、Mongooseは(すでに述べたようにsetterを使用して)ドキュメントの変更を追跡し、$setが新しい値であるという更新を実行します。

だから、この:sizeの前回値もlargeだった場合、それが更新を実行しません

tankCollection.update({ _id : tank._id }, { $set : { size : 'large' } }, ...); 

tank.size = 'large'; 
tank.save(...); 

は、(大まかに)されるように実装されています。また、新しいドキュメントの場合は、別のコードパス(tankCollection.insert())を実行します。

同時更新は、同じプロパティを更新しない場合(最後に実行された更新が勝った場合)に動作します。

関連する問題