Eine Sache, die mir hier in den Sinn kommt, ist, dass Sie möglicherweise nicht die ganze Arbeit tun müssen, die Sie für nötig halten, und Ihr Problem kann wahrscheinlich mit ein wenig Hilfe von TTL-Indizes und möglicherweise begrenzte Sammlungen . Betrachten Sie die folgenden Einträge:
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
Es gibt also zwei Einträge und Sie haben diese _id
Wert zurück, wenn Sie eingefügt haben. Also hatte "A" zu Beginn niemanden zum Spielen, aber der Eintrag für "B" wird gegen den davor spielen.
ObejctIds sind monoton , was bedeutet, dass der "Nächste" immer ist Wertvoller seit dem letzten. Machen Sie also mit den eingefügten Daten einfach Folgendes:
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
Das gibt den vorangehend eingefügten "Zug" zum aktuellen Zug, der gerade gemacht wurde, und tut dies, weil alles der zuvor eingefügt wurde, hat eine _id
mit weniger Wert als der aktuelle Artikel. Sie stellen auch sicher, dass Sie nicht gegen den eigenen Zug des Benutzers "spielen", und natürlich beschränken Sie das Ergebnis auf nur ein Dokument.
Die "Züge" bewegen sich also für immer vorwärts. Wenn die nächste Einfügung von Benutzer "C" vorgenommen wird, erhalten sie den "Zug" von Benutzer "B", und dann würde Benutzer "A" den "Zug" von Benutzer "C" erhalten " usw.
Alles, was hier passieren "könnte", ist, dass "B" den nächsten macht nacheinander "bewegen", und Sie würden das gleiche Dokument wie bei der letzten Anfrage abholen. Aber das ist ein Punkt für Ihre "Session"-Design, um das letzte "Ergebnis" zu speichern und sicherzustellen, dass Sie nicht dasselbe zurückbekommen haben, und als solches damit umzugehen Sie in Ihr Design integrieren möchten.
Das sollte zum "Spielen" reichen. Aber kommen wir zu Ihrer "Löschung". "Teil.
Natürlich „denkt“ man, man möchte Dinge löschen, aber zurück zu meinen anfänglichen „Helfern“, das sollte nicht nötig sein. Von oben wird das Löschen nur noch zu einem Faktor des "Aufräumens", damit Ihre Sammlung nicht zu massiven Ausmaßen anwächst.
Wenn Sie einen TTL-Index angewendet haben, ähnlich wie dieses Tutorial erklärt, werden Ihre Sammlungseinträge für Sie bereinigt und nach einer bestimmten Zeit entfernt.
Auch was getan werden kann, und besonders wenn man bedenkt, dass wir die Erhöhung verwenden Art der _id
key und dass dies mehr oder weniger eine "Warteschlange" in der Natur ist, könnten Sie dies möglicherweise als begrenzte Sammlung
. Sie können also eine maximale Größe für die Anzahl der "Züge" festlegen, die Sie behalten jederzeit.
Wenn Sie beides kombinieren, erhalten Sie etwas, das nur bis zu einer bestimmten Größe "wächst" und automatisch für Sie bereinigt wird, sollte sich die Aktivität etwas verlangsamen. Und das wird alle Vorgänge schnell halten .
Fazit ist, dass die Gleichzeitigkeit von "deletes ", worüber Sie sich Sorgen gemacht haben, wurde beseitigt, indem die Notwendigkeit, die gerade wiedergegebenen Dokumente zu löschen, tatsächlich "entfernt" wurde. Die Abfrage hält es einfach, und der TTL-Index und die begrenzte Sammlung kümmern sich für Sie um die Datenverwaltung.
Das ist also meine Meinung zu einem sehr simultanen Spiel „Blind War“.