【问题标题】:MongoDB versioning with timestamps as keys以时间戳为键的 MongoDB 版本控制
【发布时间】:2013-03-17 14:49:55
【问题描述】:

我正在尝试在 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" }
    }
}

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

感谢您帮助我...

【问题讨论】:

  • 您是否尝试过实施这种方法,您将如何在特定版本中构建对象。

标签: mongodb time schema versioning


【解决方案1】:

使用 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 添加索引以加快这些查询。

【讨论】:

  • 非常感谢...我会试一试
猜你喜欢
  • 2023-03-28
  • 2012-10-03
  • 1970-01-01
  • 2015-01-06
  • 2014-07-16
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多