MongoDBのアトミック操作として「人の削除+都市のカスケード削除」全体を確認するにはどうすればよいですか?
他の人が言ったように、MongoDB には 2 フェーズ コミットのクライアント側バージョンがありますが、これは次のとおりです。
- 2 フェーズのトランザクション コミットを提供しない
- アトミックではない
- かなりのオーバーヘッドがある
- クライアント側です(実際には、これがサーバー側であることから得られる利益を拒否します。つまり、失敗します)
- 障害が発生した場合、情報とトランザクションの安全性を提供できません
そうは言っても、アプリケーションがデータベースに書き込み、失敗しないことを信頼できる場合は、2 フェーズ コミットの MongoDB エディションがここで機能する可能性があります。ただし、偽の 2 フェーズ コミットを使用する余分なオーバーヘッドを追加する代わりに、クエリを次々に実行しないのはなぜですか。
通常、削除クエリの1つが成功した場合、mongodbに書き込むことができると想定されていますが、カスケードの親行を削除済みまたは何かとしてほとんど「マーク」せず、後で戻ってくる専用のcronjobがあり、一貫した方法ですべてをクリーンアップします(そこでそれを行うと、クライアントが遅延するため)。
どのスキーマ設計が最適かについては、埋め込みが優先されるとは限りません。私はあなたが次のように言っていることに気づきました:
次に、都市の人の配列を更新したい
$pull
そのアレイで使用するには、おそらくaまたは同様のものを必要とするでしょう。その配列がかなり大きくなると、メモリ内操作は$pull
2 つの個別のコレクションをクエリするよりも多少遅くなることに注意してください。
結局のところ、十分な知識がないため、スキーマ設計について実際にアドバイスすることはできません。そのため、そのままにしておきます。
編集
他の答えはどちらも重要ですが。個人文書にを埋め込むと、city_id
実際にリレーションを 1 回の呼び出しでカスケードできます。もちろん、これは奇妙です。通常、子レコードが多すぎて Mongo ドキュメントに収まらない場合がありますが、このシナリオは当てはまります。