4

我正在构建一个应用程序来处理门票销售,并期望有非常高的需求。我想尝试将 MongoDB 与服务于 node.js 网站的多个并发客户端节点一起使用(并优雅地处理客户端故障)。

我读过“限制 mongodb 中集合中的文档数”(完全不相关)和“有没有办法限制某个集合中的记录数”(但它谈到了上限集合,其中新文档覆盖最旧的文档)。

是否可以将集合中的文档数量限制为某个最大大小,并且在该限制之后的文档将被拒绝。简单的示例是将门票销售添加到数据库,如果所有门票都已售罄,则失败。

我考虑过有一个NumberRemaining文档,我可以原子地递减它直到它到达0,但是如果一个节点在递减该数字和保存购买票之间崩溃,这会给我留下一个问题。

4

3 回答 3

2

将票证存储在单个 MongoDB 文档中。由于您一次只能以原子方式设置一个文档,因此您不应该遇到可以通过使用传统事务数据库系统解决的文档依赖性问题。

由于一个文档可以达到 16MB,通过只ticket_id在主文档中存储 a,您应该能够存储大量票证,而无需进行任何额外复杂的文档管理。虽然它可能会引入热点,但文档可能不会很大。如果它确实变大,您可以使用多个文档(通过将它们拆分为多个文档作为一个文档“填充”,激活另一个文档)。

如果这不起作用,10gen 有一个可能适合的模式。

于 2013-04-05T00:29:40.933 回答
1

到目前为止我唯一的解决方案(我希望有人可以改进):

在文档到达时将其插入到无上限的集合中。保留 的隐含_idObjectID,该值可以排序,因此将按添加文档的时间对文档进行排序。

_id运行按最大文档数排序的所有查询。

要确定插入是否“成功”,请运行附加查询以检查新插入的文档是否在最大文档数内。

于 2013-04-04T14:24:48.757 回答
0

我的解决方案是:我在另一个集合中使用了一个额外的计数变量。此集合具有避免计数变量变为负数的验证规则。计数变量应始终为非负整数。

“计数”:{“$gte”:0}

算法很简单。将计数减一。如果成功插入文档。如果失败,则意味着没有剩余空间。

反之亦然删除。

您还可以使用事务来防止失败(计数减少但服务在插入操作之前失败)。

于 2018-10-04T12:26:05.600 回答