Одна вещь, которая приходит на ум, это то, что вам может не понадобиться выполнять всю работу, которую вы считаете необходимой, и ваша проблема, вероятно, может быть решена с небольшой помощью индексы TTL и, возможно, коллекции с ограничениями. Рассмотрим следующие записи:
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
Итак, есть две записи, и вы вернули это значение _id
при вставке. Таким образом, в начале «А» не с кем было играть, но запись для «Б» будет играть против предыдущей.
ObejctId являются монотонными, что означает, что "следующий" всегда больше по стоимости от последнего. Итак, с вставленными данными просто сделайте следующее:
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
Это дает предыдущему вставленному «ходу» текущий только что сделанный ход, и делает это, потому что все, что было вставлено ранее, будет иметь _id
с меньшим значением, чем текущий пункт. Вы также убедитесь, что вы не «играете» против собственного хода пользователя, и, конечно, вы ограничиваете результат только одним документом.
Таким образом, «ходы» будут всегда двигаться вперед. Когда следующая вставка будет сделана пользователем «C», они получат «ход» от пользователя «B», а затем пользователь «A» получит «ход» от пользователя «C». ", и так далее.
Все, что здесь "может" случиться, это то, что "Б" сделает следующий "ход" по порядку, и вы заберете тот же документ, что и в последнем запросе. Но это точка для вашего "сеансового" дизайна, чтобы сохранить последний "результат" и убедиться, что вы не получите то же самое обратно, и, таким образом, справиться с этим, однако вы хотите использовать в своем дизайне.
Этого должно быть достаточно, чтобы «поиграть». Но давайте перейдем к вашей части «удаление».
Естественно, вы «думаете», что хотите что-то удалить, но, вернемся к моим первоначальным «помощникам», в этом нет необходимости. Сверху удаление становится лишь фактором «очистки», поэтому ваша коллекция не разрастается до огромных размеров.
Если вы применили индекс TTL, во многом так же, как объясняет это руководство. , записи вашей коллекции будут очищены для вас и удалены через определенный период времени.
Кроме того, что можно сделать, и особенно учитывая, что мы используем возрастающую природу ключа _id
и что это более или менее "очередь" по своей природе, вы могли бы применить это как ограниченная коллекция. Таким образом, вы можете установить максимальный размер того, сколько «ходов» вы будете сохранять в любой момент времени.
Объединив их вместе, вы получите что-то, что «вырастает» только до определенного размера и будет автоматически очищаться для вас, если активность немного замедлится. И это обеспечит быстрость всех операций.
Суть в том, что параллелизм «удалений», о котором вы беспокоились, был устранен путем фактического «удаления» необходимости удалять только что воспроизведенные документы. Запрос делает его простым, а индекс TTL и ограниченная коллекция позаботятся об управлении данными за вас.
Итак, вот что я думаю об очень параллельной игре «Война вслепую».
person
Neil Lunn
schedule
10.03.2014
.eval()
. (не по теме;) - person loveNoHate   schedule 10.03.2014