我正在尝试在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搜索了一段时间才得到解决方案,但找不到任何真正有用的东西。如果有人知道如何做到这一点,那么如果你可以帮助我的话会很棒。甚至可能是这是解决问题的完全错误的方法,并且有更好的方法来解决这个问题......我对任何建议持开放态度。
感谢您帮助我...
答案 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添加索引以加速这些查询。