7

domainドメイン情報を含むドキュメントのコレクションがあります。その一部は、履歴の whois レコードであり、ゼロまたはそれ以上の可能性があり、ドキュメントのスペースの大部分を占めています。

ドキュメント全体をロードし、小さなものを変更して (数値フィールドを更新するなど)、save()メソッドを使用すると、mongo はドキュメント全体をディスクにフラッシュするか、変更された BSON のみを更新しますか? 最終的に私の質問は、update()I/O を節約するためにコードを で複雑にする必要があるのか​​、それとも単に を使用する必要があるのか​​ということsave()です。

これは単に怠惰によるものではありません。ドキュメントは (全体が読み取られた後) 一連の手順を経てドキュメントを変更/処理し、変更が加えられた場合はドキュメント全体が保存されます。しかし、ドキュメントを保存するコストが高い場合は、別の方法で考えなければならないかもしれません...

4

3 に答える 3

6

を使用して、ドキュメント内の 1 つのフィールドを更新できます$set。これにより、ディスク上のフィールドが変更されます。ただし、ドキュメントが更新前のサイズを超えて大きくなった場合、ドキュメントをディスク上で再配置しなければならない場合があります

一方、ドキュメントにはvsについて次のように記載されていますsaveupdate

>// x is some JSON style object
>db.mycollection.save(x); // updates if exists; inserts if new
>
>// equivalent to:
>db.mycollection.update( { _id: x._id }, x, /*upsert*/ true );

参考文献

于 2012-06-25T02:46:20.460 に答える
2

この質問が古いことは承知していますが、データベース構造の設計に役立つ仕組みを知っておくと非常に役立ちます。MongoDB のストレージ エンジンの詳細は次のとおりです: https://docs.mongodb.com/v3.2/faq/storage/

ドキュメントは質問に答えます。基本的に、MongoDB の整数フィールドを更新すると、整数が存在するメモリ内のページ (通常は 4k) がダーティであるとマークされ、次のディスク フラッシュでメモリ ページがディスクに書き込まれます。そのため、ドキュメントのサイズが非常に大きい場合、ドキュメントの一部しかディスクに書き込まれない可能性があります。

ただし、他にも多くのケースがあります。ドキュメントにより多くのデータをパディングする場合、MongoDB がドキュメント全体を新しい場所に移動して、ドキュメントが大きくなる可能性があります。その場合、ドキュメント全体がディスクに書き込まれます。

于 2016-11-09T20:52:56.343 に答える
2

これは、使用しているクライアント ライブラリによって異なります。たとえば、Mongoid (Ruby の ODM) は、($setコマンドを使用して) 変更されたフィールドのみを送信するほどスマートです。あまりにも賢すぎて、ネストされたハッシュに加えた変更をキャッチしないことがあります。しかし、変更されていないフィールドを送信するのを見たことはありません。

他のライブラリ/ドライバーは異なる動作をする場合があります。

于 2012-06-25T07:51:24.203 に答える