MongoDB集合作为FIFO堆栈

时间:2012-10-10 07:53:32

标签: mongodb stack mongodb-.net-driver

我需要使用MongoDB集合实现FIFO逻辑:

  1. 弹出MongoDB集合中的第一个文档。
  2. 将文档推送到MongoDB集合并将其作为最后一个文档放置。
  3. 集合中的文档除自动生成的_id(ObjectId)外没有任何索引。

    我想知道,是否可以从集合中找到并删除第一个文档并保证推送和弹出操作将以原子方式执行FIFO堆栈?

    我知道可以使用原子推送和弹出操作来处理文档中的数组,但主要问题是如果我将所有数据存储在1个文档的数组中,它的大小将超过16MB(允许的最大值) MongoDB文档的大小)

    提前致谢, 的Valentin

2 个答案:

答案 0 :(得分:5)

如果您从一台计算机上访问堆栈,可以使用findAndRemove进行访问:

db.col.findAndModify({query:{}, sort:{i: -1}, remove:true})

这将返回已删除的值,并根据您的请求自动删除文档本身。其中“i”是时间排序字段(如果它是ObjectId,则_id可用)。如果您正在使用来自多个实例的FIFO堆栈/集合,则必须确保“i”值在所有实例中以原子方式增加,否则您将不得不使用FIFO-ish而非严格如此。< / p>

答案 1 :(得分:1)

由于document _id是文档创建日期的值,因此您可以对文档进行排序以检索创建的第一个/最后一个文档。要获取最后创建的文档,您可以这样做:

db.collection.find().sort({ _id : -1 }).limit(1)

然后,将文档添加到集合中将在集合端添加它。