1

ドキュメントを挿入/更新/削除するときに、MongoDB がデフォルトで非同期書き込みを使用することを知っています。私の質問は、これらの更新がまだ順番に実行されているかどうかです。

次の upsert-query の後に delete-query があるとします。

db.servers.update({ "server": "abcdef" }, { "$set": { "lastSeen": new Date()}}, /*upsert=*/ true);
db.servers.update({ "server": "uvwxyz" }, { "$set": { "lastSeen": new Date()}}, /*upsert=*/ true);
db.servers.remove({ "lastSeen": { "$lt": new Date(Date.now() - 3600000) }  });

これらのコマンドがこれらの順序で実行される場合、(操作が成功した場合) 最初に 2 つのドキュメントが挿入/更新され、次に削除操作によって古いドキュメントが削除されることが保証されますか? 「lastSeen」値が更新されたため、挿入/削除されたドキュメントの両方が削除されないようにしたい。

「非同期書き込み」は、データがRAMからディスクに書き込まれる時間にのみ関係していると思います。上記の例が常に機能するように (更新が成功した場合)、コマンドの順序には影響しないと思いますよね?

編集: 単一の mongod インスタンスを使用します。レプリカセットなし、シャーディングなし:-)

4

1 に答える 1

3

単一の接続を介して送信されるコマンドはシリアル化されます。したがって、1 つの接続を介してそれらを送信するとremove、2 つの挿入の後に発生することが保証されます。

非同期書き込み (別名「ファイア アンド フォーゲット」) は、クライアント ライブラリが書き込みの確認応答を待機しないことを意味します。インサートをソケットに吐き出すだけで、それを忘れます。この挿入を適用するときに、(たとえば) 一意のインデックス違反が発生した場合は、決してわかりません。

ちなみに、 mongodb の最新機能であるTTL インデックスを使用できます。MongoDB は古いデータを独自に削除します。挿入し続けるだけです :)

于 2012-09-07T12:49:25.297 に答える