mongodb query - Spring Data - 检索最后版本的预留

时间:2014-06-05 15:45:17

标签: mongodb spring-data

使用Mongodb和spring数据,我有一个存储Reservation对象的预订集合。 预订对象具有Id和版本。 我想执行一个查询,检索上一版本的所有预留。 我有点被困了。 我想我可以用map reduce工作来做,但我想用Query或Aggregation来做。 任何帮助将不胜感激。 感谢。

1 个答案:

答案 0 :(得分:0)

您的问题实际上是关于在MongoDB中实现版本控制方案。

有关此主题的一些现有资源:

它基本上归结为两种方法:

  1. 存储文档中嵌入的历史版本
  2. 将历史版本存储在单独的"阴影中#34;集合
  3. 您为这些历史版本存储的内容可能是更改增量,或者可能是文档的完整副本。每种方法都需要权衡取决于您需要查询和查看历史数据的方式。

    假设使用上一版本检索所有预订是应用程序的常见访问模式,您可能希望遵循其中一种方法而不是初始方法。在不了解您的应用程序的情况下,我会说将旧版本存储到单独的“阴影”中。收集可能是最好的方法。

    如果预订频繁或大量更新,嵌入方法将导致您的文档随着时间的推移而增长。并且假设不经常访问历史版本,这会增加不必要的内存和IO开销。

    同样,根据您的要求,您也可以使用任何一种只存储最后 n 预订修订版的方法。

    更新 - 另一种方法

    鉴于您的评论,您必须在同一个集合中拥有所有预订,并假设您无法更改此约束(这将是我的首选),这是另一种方法。您可以实施版本编号方案,您可以使用固定版本号存储最新版本的预留。因此,例如版本号1将始终是预订的最新版本。在该文档中,您可能希望存储预订的版本总数(例如numVersions)。

    因此,当预订更新时,您需要执行两个步骤:

    1. findAndModify()预订的最新副本,将版本字段设置为numVersions + 1。

    2. 插入版本= 1的新预订文档,该文档将成为预订的最新版本

    3. 另一种类似的方法是添加某种"最新的"标记到最新版本的预订,而不是使用版本编号方法。这种方法类似,因为当您插入新版本的预订时需要两个步骤,例如,删除"最新"从当前最新预订中标记,然后使用"最新"标签集。