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

标签 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" }
    }
}

我在谷歌上搜索了很长一段时间来寻找解决方案,但找不到任何真正有用的东西。如果有人知道如何做到这一点,那么如果您能帮助我,那就太好了。甚至可能这是解决问题的完全错误的方法,并且有更好的方法来解决这个问题......我愿意接受任何建议!

谢谢你帮我...

最佳答案

使用 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/

相关文章:

linux - 访问配置数据库时拒绝

javascript - MongoDB - 根据非常嵌套的属性查找父对象

sql - SQL查询中需要小时数差异

c - 使用 difftime 获取从现在到 future 的时差(以秒为单位)

json - Golang bson structs - 对 json 中的单个字段使用多个字段名称,但只有一个用于写入数据库

mongodb - 在CentOS 6.3上编译mongo-perf时未定义的Boost引用

c++ - 使用 boost::posix_time::microsec_clock::local_time() 的计时给出负值?

go - Terraform 自定义提供程序 - 数据源

json - Oracle PL/SQL 是否提供了 JSON 模式验证器?

c# - IXmlSerialized 根据架构进行验证