MongoDB配对和删除顺序数据库条目的最佳方法

好吧,让我们说我正在做一场盲目的战争游戏! 用户A和B有x个士兵

目前有0个DB文档。

用户A发送50名制作DB文档的士兵用户B在用户A后发送62名士兵!

这将创build一个新的数据库文档。

我需要最有效/可扩展的方式来查找用户A的文档,将其与用户B的文档进行比较,然后删除这两个文档! (当然返回结果后)

这是问题! 我可能有一万多名用户在相同的时间发送士兵! 如何成功完成上述过程而不重叠?

我正在使用MEANstack进行开发,所以我不仅限于在数据库中这样做,但显然WebApp必须100%安全!

如果您需要任何其他信息或解释,请让我知道,我会更新这个问题

-谢谢

在这里想到的一件事是,你可能不需要做所有你认为需要的工作,而你的问题可以通过TTL索引和可能的限制集合的一些帮助来解决。 考虑以下条目:

{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 } { "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 } 

所以有两个条目,当你插入时你得到了这个_id值。 所以一开始“A”就没有人打,但是“B”的入场将会跟前面的打。

ObejctId是单调的 ,这意味着沿着“下一个”的价值总是比最后一个更大。 所以插入的数据,只要这样做:

 db.moves.find({ _id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") }, user: { $ne: "B" } }).limit(1) 

这使前面插入的“移动”到刚刚创build的当前移动,并执行此操作,因为之前插入的任何内容都将具有比当前项目更less_id 。 你也要确保你不是在玩“用户自己的行动”,当然你只能将结果限制在一个文档中。

因此,“移动”将永远向前移动,当用户“C”进行下一个插入时,他们从用户“B”获得“移动”,然后用户“A”从用户“C”获得“移动” “, 等等。

所有“可能”在这里发生的是,“B”按顺序进行下一个 “移动”,并且你会拿起与上一个请求相同的文档。 但是,这是“会话”devise的一个要点,要存储最后的“结果”,并确保没有得到相同的结果,因此,无论想要在devise中如何处理。

这应该足以“玩”。 但让我们来到你的“ 删除 ”部分。

当然,你“想”你想删除的东西,但回到我最初的“帮手”,这不应该是必要的。 从上面看,删除只是“清理”的一个因素,所以你的collections不会成长到很大的比例。

如果您应用了TTL索引,则与本教程所解释的方式大致相同,您的收集条目将为您清理,并在一段时间后移除。

还有什么可以做的,尤其是考虑到我们正在使用_id键的不断增长的性质,而且这或多或less是一个“队列”的性质,你可以把它作为一个封闭的集合 。 所以你可以设置一个最大的大小, 以便在任何给定的时间你将保留多less“移动”。

将两者结合在一起,你就会得到一些只能“增长”到一定大小的东西,并且会自动为你清理,如果活动减慢一点。 这将保持所有的操作快速

底线是,您所担心的“ 删除 ”的并发性已经通过实际“删除”删除刚刚播放的文档的需要而被删除。 查询保持简单,并且TTL索引和封顶集合在您为您pipe理数据之后。

所以你有什么是我的“盲目战争”的并发游戏。