限制mongodb集合中的文档数量,不使用FIFO策略

时间:2013-04-04 13:56:27

标签: mongodb

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

我读过“Limit the number of documents in a collection in mongodb”(完全不相关)和“Is there a way to limit the number of records in certain collection”(但是会讨论上限集合,新文档会覆盖最旧的文档)。

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

我考虑过一个NumberRemaining文件,我可以原子地删除它直到它达到0但是如果一个节点在递减该号码之间崩溃并且保存购买票证就会出现问题

3 个答案:

答案 0 :(得分:2)

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

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

如果这不起作用,10gen可能适合pattern

答案 1 :(得分:1)

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

在文档到达时将文档插入到无上限的集合中。保留_id的隐式ObjectID值,该值可以进行排序,因此会在添加文档时对文档进行排序。

运行_id排序的所有查询,并限制为最大文档数。

要确定插入是否成功",请运行另一个查询,检查新插入的文档是否在最大文档数内。

答案 2 :(得分:0)

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

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

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

反之亦然。

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