sql >> データベース >  >> NoSQL >> MongoDB

MongoDB $ setは、フィールドだけを書き込むのですか、それともドキュメント全体を書き込むのですか?

    TL; DR:$inc インプレース更新を保証します、$set そうではありませんが、非常に特殊な状況では、その場で行うこともできます。

    詳細

    これには2つの側面があります:

    1. どのようにネットワークを通過しますか?

      情報は、操作、$setとして送信されます $setのままです だからそれはデルタです。これは、レプリケーションに使用されるoplogにも当てはまります。このように、$setを使用します 帯域幅に関してより効率的です。

    2. ディスク上でどのように更新されますか?

      MongoDBはインプレース更新を実行します キー(フィールド)がすでに存在する場合のみ したがって、ドキュメントに新しいフィールドを追加する場合、既存のフィールドに別の値を割り当てるよりも大きな操作になります。

      ただし、その場合でも、値は同じサイズである必要があります タイプを変更してはいけません そしてそれらはタイプでなければなりません double, long, int or bool 、それ以外の場合は 現在、インプレースアップデート。

    後者が実際にどのように重要であるかはわかりません 、ただし、サーバーは2つに対して完全に異なるコードパスを使用するため、たとえばフィールドの並べ替えにつながる可能性があります。非常に大きなドキュメントの場合、パフォーマンスに測定可能な違いが生じる可能性があります。

    これは、$inc$incであるため、確実にインプレースである操作のみが許可されるという点で大きく異なります。 数値タイプでのみ動作し、当然、サイズやタイプを変更することはできません。



    1. Mongodbのサブドキュメントから最新のレコードを返す

    2. サブドキュメントの配列にあるフィールドのインデックス作成

    3. Mongo ObjectIDs:実際に使用しても安全ですか?

    4. すべてのMongoコレクションをループして、クエリを実行します