我正在尝试在 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" }
}
}
我在谷歌上搜索了很长一段时间来寻找解决方案,但找不到任何真正有用的东西。如果有人知道如何做到这一点,那么如果您能帮助我,那就太好了。甚至可能这是解决问题的完全错误的方法,并且有更好的方法来解决这个问题......我愿意接受任何建议!
谢谢你帮我...
最佳答案
使用 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" }
]
}
这允许您使用changes.change_date字段进行$gte或$lte的查询。您还可以通过 $max
aggregation grouping operator 找到最新的一个。 (不要与 $max query operator 混淆,它的作用完全不同)。
您可能还想向changes.change_date 添加索引以加快这些查询的速度。
关于使用时间戳作为键的 MongoDB 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660272/