Node.js MongoDB配对和删除顺序数据库项的最佳方法

Node.js MongoDB配对和删除顺序数据库项的最佳方法,node.js,mongodb,express,mongodb-query,mean-stack,Node.js,Mongodb,Express,Mongodb Query,Mean Stack,好吧,假设我在做一个盲目战争的游戏! 用户A和B拥有x数量的士兵 当前有0个DB文档 用户A发送50名士兵制作DB文档 用户B在用户A之后发送62名士兵 这将创建一个新的DB文档 我需要最有效/可扩展的方式来查找用户A的文档,将其与用户B的文档进行比较,然后删除这两个文档!(返回课程结果后) 问题来了!我可能会有10000多名用户同时派遣士兵!我如何才能在不重叠的情况下成功完成上述过程 我正在使用MEANstack进行开发,因此我不局限于在数据库中执行此操作,但显然,WebApp必须100%安全

好吧,假设我在做一个盲目战争的游戏! 用户A和B拥有x数量的士兵

当前有0个DB文档

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

这将创建一个新的DB文档

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

问题来了!我可能会有10000多名用户同时派遣士兵!我如何才能在不重叠的情况下成功完成上述过程

我正在使用MEANstack进行开发,因此我不局限于在数据库中执行此操作,但显然,WebApp必须100%安全

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


-谢谢

这里想到的一件事是,您可能不需要做您认为需要做的所有工作,您的问题可能会在您的帮助下得到解决。考虑以下条目:

{ "_id" : ObjectId("531cf5f3ba53b9dd07756bb7"), "user" : "A", "units" : 50 }
{ "_id" : ObjectId("531cf622ba53b9dd07756bb9"), "user" : "B", "units" : 62 }
因此,有两个条目,您在插入时得到了
\u id
值。所以在一开始,“A”没有对手,但“B”的条目将与它之前的条目竞争

ObejctId的是,这意味着“下一个”的值总是比上一个的值大。因此,对于插入的数据,只需执行以下操作:

db.moves.find({ 
    _id: {$lt: ObjectId("531cf622ba53b9dd07756bb9") }, 
    user: { $ne: "B" } 
}).limit(1)
这将前面插入的“移动”赋予刚刚进行的当前移动,这是因为先前插入的任何东西都将具有小于当前项的
\u id
。您还必须确保您没有“玩”用户自己的移动,当然,您将结果限制为仅一个文档

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

这里“可能”发生的只是“B”按顺序执行下一个“移动”,然后您将拾取与上一个请求相同的文档。但是这是你的“会话”设计的一个要点,存储最后的“结果”,并确保你没有得到同样的东西,因此,无论你在设计中多么想处理它

这应该足够“玩”了。但是让我们来看看你的“删除”部分

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

如果您应用了TTL索引,与前面介绍的方法大致相同,那么您的集合条目将被清理,并在一段时间后被删除

另外,可以做些什么,特别是考虑到我们使用的是
\u id
键的递增性质,并且这在本质上或多或少是一个“队列”,您可以将其应用为一个队列。因此,您可以将最大大小设置为在任何给定时间保持多少次“移动”

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

底线是,您担心的“删除”的并发性已经通过实际“删除”刚刚播放的文档而被删除。查询保持简单,TTL索引和capped集合为您管理数据


这就是我对一个非常并行的“盲目战争”游戏的看法。

这里有一个问题,我要看,用什么方式比较两个文档?比较如下:查看每个文档的兵力值!有效地将它们按顺序排列。又名Doc1和2(返回赢家=Doc1,删除两个)Doc3和4(返回赢家=Doc4,删除两个)这似乎太少了一点。我认为首先你需要解释你将如何为“A”和“B”存储这些“动作”,并清楚地解释你如何知道它们是在相互竞争。否则这将成为一个非常广泛的问题,eberyones的观点将有所不同。游戏的重点是最小化!没有帐户,只有基于会话的用户。游戏目前使用restful调用进行游戏。基本上,每个用户都在与他们之前的用户竞争。如果他们之前的用户派遣了20名士兵,他们将派遣20多名士兵获胜,但不知道他们之前的用户派遣了多少军队!嘿事实上,我认为这个解决方案几乎完美地满足了我的需求,昨天我几乎接受了它!然而问题是这样的。被派遣的部队已集结。然后获胜者从该池中获得x数量的部队。因此,如果用户b扮演用户a,用户c扮演用户b,那么由于用户b拥有并且他的部队不再在中央储备库中,部队储备库将过度撤离!有没有一种方法可以应用上面的答案,从而只匹配两个用户?@gbachik我想在这里显示的内容是根据您的问题的上下文,它依赖于处理“对”文档,可以避免更新和删除的并发性问题,并获得相同的结果。这就是答案。你的新问题是一个有趣的问题,但是我想到了一些关于通知玩家“赢/输”的事情,就像我给你的材料一样。想一想,你还是想不起来,然后你总是可以问另一个问题。真的!我在这里提出了另一个问题: