ここで頭に浮かぶことの1つは、必要と思われるすべての作業を行う必要がない場合があることです。問題は、TTLインデックス
おそらく
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
したがって、2つのエントリがあり、その_id
を取得します。 挿入したときに値が戻ります。したがって、最初は「A」には対戦相手がいませんでしたが、「B」のエントリはその前のエントリと対戦します。
ObejctIdは、単調 です。 、つまり、「次の」ものは常に 最後から値が大きい。したがって、挿入されたデータを使用して、次のようにします。
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
これにより、前に挿入された「移動」が、今行われた現在の移動に与えられます。これは、何かが原因で行われます。 以前に挿入されたものには_id
があります 価値が低い 現在のアイテムより。また、ユーザー自身の動きに対して「遊んで」いないことを確認します。もちろん、結果を1つのドキュメントのみに制限します。
したがって、「移動」は永遠に前進します。次の挿入がユーザー「C」によって行われると、ユーザー「B」から「移動」を取得し、ユーザー「A」はユーザー「C」から「移動」を取得します。 "など。
ここで「起こり得る」ことは、「B」が次へを作成することだけです。 順番に「移動」すると、最後のリクエストと同じドキュメントを取得します。しかし、それはあなたのにとってのポイントです 「セッション」の設計。最後の「結果」を保存し、同じものが返されなかったことを確認します。そのため、あなたがそれに対処します。 あなたのデザインにしたい。
それは「遊ぶ」のに十分なはずです。しかし、あなたの「削除」に取り掛かりましょう 「一部。
当然、あなたは物事を削除したいと「思います」が、私の最初の「ヘルパー」に戻ると、これは必要ないはずです。上記から、削除は「クリーンアップ」の要素にすぎないため、コレクションが大幅に増えることはありません。
TTLインデックスを適用した場合は、このチュートリアル> 説明によると、コレクションエントリはクリーンアップされ、一定期間後に削除されます。
また、何ができるか、特に増加を使用していることを考慮すると _id
の性質 キーであり、これは本質的に「キュー」であるため、これを上限のあるコレクション
。したがって、最大サイズを、保持する「移動」の数に設定できます。 いつでも。
この2つを組み合わせると、特定のサイズにのみ「成長」し、アクティビティが少し遅くなった場合に自動的にクリーンアップされるものが得られます。これにより、すべての操作が高速に保たれます。 。
結論として、「削除」の同時実行性は 「心配していたことは、再生したばかりのドキュメントを削除する必要性を実際に「削除」することで削除されました。クエリによってシンプルになり、TTLインデックスと上限付きコレクションがデータ管理を管理します。
これで、「ブラインドウォー」の非常に同時進行のゲームに対する私の見解がわかりました。