TL; DR:$inc
インプレース更新を保証します、$set
そうではありませんが、非常に特殊な状況では、その場で行うこともできます。
詳細h4>
これには2つの側面があります:
-
どのようにネットワークを通過しますか?
情報は、操作、
$set
として送信されます$set
のままです だからそれはデルタです。これは、レプリケーションに使用されるoplogにも当てはまります。このように、$set
を使用します 帯域幅に関してより効率的です。 -
ディスク上でどのように更新されますか?
MongoDBはインプレース更新を実行します キー(フィールド)がすでに存在する場合のみ したがって、ドキュメントに新しいフィールドを追加する場合、既存のフィールドに別の値を割り当てるよりも大きな操作になります。
ただし、その場合でも、値は同じサイズである必要があります タイプを変更してはいけません そしてそれらはタイプでなければなりません
double, long, int or bool
、それ以外の場合は 現在、インプレースアップデート。
後者が実際にどのように重要であるかはわかりません 、ただし、サーバーは2つに対して完全に異なるコードパスを使用するため、たとえばフィールドの並べ替えにつながる可能性があります。非常に大きなドキュメントの場合、パフォーマンスに測定可能な違いが生じる可能性があります。
これは、$inc
が $inc
であるため、確実にインプレースである操作のみが許可されるという点で大きく異なります。 数値タイプでのみ動作し、当然、サイズやタイプを変更することはできません。