2

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

  1. 从 MongoDB 集合中弹出第一个文档。
  2. 将文档推送到 MongoDB 集合并将其作为最后一个文档放置。

集合中的文档除了自动生成的 _id (ObjectId) 之外没有任何索引。

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

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

提前致谢, 瓦伦丁

4

2 回答 2

5

如果您正在从单台机器访问堆栈,则可以使用 findAndRemove 进行访问:

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

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

于 2012-10-10T08:09:05.173 回答
1

因为文档_id 是文档创建日期的值,您可以对文档进行排序以检索第一个/最后一个创建的文档。要获取最后创建的文档,您可以执行以下操作:

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

然后,将文档添加到集合中会将其添加到集合末尾。

于 2012-10-10T07:59:53.347 回答