使用时间戳作为键的MongoDB版本控制

时间:2013-03-27 13:39:01

标签: mongodb time schema versioning

我正在尝试在MongoDB中实现版本控制(基于在文档之间存储差异),如本文所述:Ways to implement data versioning in MongoDB

到目前为止,我使用相同的方法,但想要进行如下查询:“给我Date1和Date2之间的所有更改”。帖子中显示的模式仅使用普通的增量编号作为更改的关键,不允许进行此类查询:

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

我唯一的猜测是,为了进行基于时间的查询,我必须在键值中包含一些时间信息。也许是像这样的ObjectId或ISODate:

{
    _id : "id of address book record",
    changes : { 
                ISODate(Date) : { "city" : "Omaha", "state" : "Nebraska" },
                ObjectId(id) : { "city" : "Kansas City", "state" : "Missouri" }
    }
}

我用Google搜索了一段时间才得到解决方案,但找不到任何真正有用的东西。如果有人知道如何做到这一点,那么如果你可以帮助我的话会很棒。甚至可能是这是解决问题的完全错误的方法,并且有更好的方法来解决这个问题......我对任何建议持开放态度。

感谢您帮助我...

1 个答案:

答案 0 :(得分:3)

使用IsoDate(或简单日期)进行版本控制是一种很好的方法。但是,为了有效地搜索它,您不应将其用作字段标识符,而是将更改作为数组并将日期放入此数​​组中的子文档中:

{
    _id : "id of address book record",
    changes : [ 
                { "change_date": ISODate(Date), "city" : "Omaha", "state" : "Nebraska" },
                { "change_date": ISODate(Date), "city" : "Kansas City", "state" : "Missouri" }
    ]
}

这允许您对$ gte或$ lte的查询使用changes.change_date字段。您还可以找到$max aggregation grouping operator的最新版本(不要与$max query operator混淆,这会完全不同。)

您可能还想为changes.change_date添加索引以加速这些查询。