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

MongoDBシーケンシャルデータベースエントリをペアリングして削除するための最良の方法

    ここで頭に浮かぶことの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インデックスと上限付きコレクションがデータ管理を管理します。

    これで、「ブラインドウォー」の非常に同時進行のゲームに対する私の見解がわかりました。




    1. MongoDBがクエリに非常に類似している(正確ではない)複合インデックスを使用できないのはなぜですか?

    2. SpringデータMongoDBのAggregationOperationのリストからAggregationを作成するにはどうすればよいですか?

    3. MongoDBを使用してHerokuで独自のParseServerをホストするにはどうすればよいですか?

    4. autorizedcollectionを使用したListCollections