2

我正在尝试在 MongoDB 中实现版本控制(基于存储文档之间的差异),如本文所述:在 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" }
    }
}

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

谢谢你的协助...

4

1 回答 1

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" }
    ]
}

这允许您使用 changes.change_date 字段进行 $gte 或 $lte 查询。$max您还可以使用聚合分组运算符找到最近的一个(不要与$max 查询运算符混淆,后者的作用完全不同)。

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

于 2013-03-27T14:05:10.180 回答