【问题标题】:MongoDB collections as FIFO stackMongoDB 集合作为 FIFO 堆栈
【发布时间】:2012-10-10 07:53:31
【问题描述】:

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

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

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

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

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

提前致谢, 瓦伦丁

【问题讨论】:

  • 检查上限集合。

标签: mongodb stack mongodb-.net-driver


【解决方案1】:

如果您是从单台机器访问堆栈,您可以使用 findAndRemove :

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 是否可以进行原子查找/删除?
  • 你会在这件事上找到很好的帮助here
猜你喜欢
  • 2012-04-23
  • 2014-02-20
  • 2017-01-03
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2015-08-03
  • 2021-09-14
  • 2023-03-30
相关资源
最近更新 更多