好的,让我说我正在进行一场盲战游戏! 用户A& B有x个士兵
目前有0个DB文档。
用户A派遣50名士兵制作数据库文档 用户B在用户A之后发送了62名士兵!
这会创建一个新的DB文档。
我需要最有效/可扩展的方式来查找用户A的文档,将其与用户B的文档进行比较然后删除这两个文档! (当然返回结果后)
这是问题所在!我可能有超过10,000名用户在相同的时间派遣士兵!如何在不重叠的情况下成功完成上述过程?
我正在使用MEANstack进行开发,因此我不仅限于在数据库中执行此操作,但显然WebApp必须100%安全!
如果您需要任何其他信息或解释,请告诉我,我会更新此问题
-Thanks
答案 0 :(得分:2)
这里想到的一件事是你可能不需要做你认为需要的所有工作,而你的问题可能会在TTL Indexes和capped collections的帮助下得到解决。 }。请考虑以下条目:
{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
所以有两个条目,当你插入时你得到_id
值。所以一开始,“A”没有人可以参加比赛,但是“B”的参赛作品将与之前的比赛进行比赛。
ObejctId是monotonic,这意味着“下一个”沿着始终的值超过了最后一个。因此,使用插入的数据,只需执行以下操作:
db.moves.find({
_id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") },
user: { $ne: "B" }
}).limit(1)
这会将前面插入的“移动”移动到刚刚进行的当前移动,并执行此操作,因为先前插入的任何将具有_id
且更少的值比当前项目。您还要确保您没有“玩”用户自己的行动,当然您只能将结果限制为一个文档。
所以“移动”将永远向前移动,当用户“C”进行下一次插入时,他们从用户“B”获得“移动”,然后用户“A”将从用户“C”,等等。
“可能”在这里发生的一切就是“B”按顺序使下一个“移动”,你会选择与上一个请求中相同的文档。但这是你的“会话”设计的一个要点,要存储最后的“结果”,并确保你没有得到同样的东西,因此,处理那些你想要在你的设计中。
这应该足以“玩”了。但是,让我们进入你的“删除”部分。
当然,你“想”你想删除的东西,但回到我最初的“助手”,这不应该是必要的。从上面来看,删除只是“清理”的一个因素,因此您的收藏不会大幅增加。
如果您应用TTL索引,与this tutorial解释的方式大致相同,您的收集条目将会为您清理,并在一段时间后删除。
还可以做些什么,特别是考虑到我们正在使用_id
密钥的增加性质,并且这或多或少是一个“队列”,你可以可能将此作为capped collection应用。因此,您可以将最大尺寸设置为在任何给定时间保持的“移动”次数。
将两者结合在一起,你会得到一些只能“增长”到一定大小的东西,如果活动减慢一点,你会自动清理。这将使所有操作保持快速。
最重要的是,通过实际“删除”删除刚刚播放的文档的需要,已经删除了您担心的“删除”的并发性。查询保持简单,TTL索引和上限集合为您提供数据管理。
所以,你有一个非常并发的“盲战”游戏。