您能分享一下您的 idea 吗?您将如何在MongoDB中实现数据版本控制.(我已经问了similar question regarding Cassandra个问题.如果你有什么 idea ,请分享)

假设我需要在一个简单的地址簿中对记录进行版本设置.(地址簿记录存储为平面json对象).我希望历史:

  • 将不经常使用
  • 将一次全部使用,以"时间机器"的方式呈现
  • 一张唱片的版本不会超过几百个.

我正在考虑以下方法:

  • 创建新的对象集合以存储记录的历史记录或对记录的更改.它将 for each 版本存储一个对象,并引用地址簿条目.这些记录如下:

    {
     '_id': 'new id',
     'user': user_id,
     'timestamp': timestamp,
     'address_book_id': 'id of the address book record' 
     'old_record': {'first_name': 'Jon', 'last_name':'Doe' ...}
    }
    

    这种方法可以修改为存储每个文档的一系列版本.但这似乎是一种没有任何优势的较慢的方法.

  • 将版本存储为附加到通讯簿条目的序列化(JSON)对象.我不知道如何将这些对象附加到MongoDB文档.也许是一组字符串.

推荐答案

第一个大问题是"how do you want to store changesets"

  1. 差别?
  2. 整张唱片?

我个人的做法是存储差异.因为这些差异的展示实际上是一个特殊的动作,所以我会把这些差异放在一个不同的"历史"集合中.

我会使用不同的集合来节省内存空间.一般来说,对于一个简单的查询,您不需要完整的历史记录.因此,通过将历史记录保存在对象之外,您还可以在查询数据时将其保存在通常访问的内存之外.

为了让我的生活更轻松,我会制作一份历史文档,其中包含一本带有时间戳的差异字典.比如:

{
    _id : "id of address book record",
    changes : { 
                1234567 : { "city" : "Omaha", "state" : "Nebraska" },
                1234568 : { "city" : "Kansas City", "state" : "Missouri" }
               }
}

为了让我的生活变得更加轻松,我将把这部分数据对象(EntityWrapper,无论什么)用于访问我的数据.通常,这些对象具有某种形式的历史记录,因此您可以轻松地重写save()方法以同时进行此更改.

UPDATE: 2015-10

看起来现在有a spec for handling JSON diffs个.这似乎是存储差异/更改的更可靠的方法.

Mongodb相关问答推荐

基于另一子文档更改子文档的引用

MongoDB—基于数组中同一文档中的另一个字段更新字段

MongoDB通过查找具有多个数组的对象进行聚合

Select 筛选聚合中的嵌套字段

Mongoose 查询以获取内部数组和该内部数组中的特定元素

Mongo按最大分组排序

如何在 mongodb 中将一个方面的结果合并到一个有条件的列表中?

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

Mongoose 更新不同类型的记录

$group 和 sum + 添加所有大于

mongo.lock 文件有什么用?

哪个库最适合用于带有 Scala 的 MongoDB?

在mongoose中添加多个验证

MongoDB:在集合上设置 TTL 索引时出错: sessions

如何解决 ClassNotFoundException:com.mongodb.connection.BufferProvider?

如何使用 MongoDB 以编程方式预拆分基于 GUID 的分片键

Mongo: query by key one level deep

Flask:设置应用程序和请求特定的属性?

在 MongoDB 中为现有用户更改密码

单个语句中的多个 mongo 更新运算符?