如何检索MongoDB中每个文档的上次更新时间?

时间:2012-12-20 09:15:53

标签: mongodb morphia

我想知道是否有办法在MongoDB的集合中获取数据的最后更新/修改时间(即文档)。更清楚的是,我想进行查询以检索在特定时间之后更新的所有文档。

有没有办法在MongoDB中检索最后修改的时间戳?

注意:对于新创建的文档,我知道我们可以从objectId中检索时间戳,但是对于更新,id将是相同的。 MongoDB是否将每个文档的最后更新时间存储在任何地方?

我使用morphia作为java驱动程序,所以如果有任何可能的方式来自morphia,请告诉我。

4 个答案:

答案 0 :(得分:15)

您需要自己捕获上次更新时间。

对于我的应用程序,我保留一个AuditTrail对象,它捕获AuditEvents。这些事件发生在对象的任何插入,更新或删除上(删除在我的系统中是虚拟的,只是设置一个标志)。

对于每个AuditEvent,我会跟踪日期,经过身份验证的用户,数据库操作以及应用程序填写的说明。这是在PersistentObject中实现的,因此对于Mongo中保存的任何对象的任何数据库操作都会自动调用它。

这实际上花了很少的时间来实现,但提供了获取上次更新时间的能力,以及您在Mongo中为安全性和客户支持所需的任何其他信息。

答案 1 :(得分:8)

不,MongoDB本身不存储创建或更新时间戳。你必须自己做(并且你已经发现,如果你使用ObjectID _id,那么你已经获得了创建日期。)

答案 2 :(得分:3)

您可以使用审计跟踪实体作为@ user1530669提到(我称之为delta delta - 代码已经在StackOverflow上的某处可用)。

或者您可以简单地保存上次更改时间。我通常使用基本实体进行设置,所有其他实体都对其进行扩展(根据您的具体要求,您可以删除creationDate,因为lastChange已经足够了):

protected Date creationDate;
protected Date lastChange;

// Getters and setters or final setters which don't do anything,
// if you only want to allow the entity to update the values

@PrePersist
public void prePersist() {
    creationDate = (creationDate == null) ? new Date() : creationDate;
    lastChange = (lastChange == null) ? creationDate : new Date();
}

然后,您可以在查询中添加过滤器,以使lastChange属性比检索限制更新。

答案 3 :(得分:0)

您可以执行以下操作。使用 MongoDB 4.2 + 版本,您现在可以执行$toDate之类的聚合运算符,以从ObjectId“ _id” update中同时提取时间戳时间。

在这里,我们使用聚合查询$toDate从MongoDB的ObjectId“ _id”字段中提取时间戳,并使用{$replaceRoot: {newRoot: "$$ROOT"}}来更新文档,而不是显式声明$set

var collection = "person"

agg_query = [
    {
        "$addFields" : {
            "_last_updated" : {
                "$toDate" : "$_id"
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: "$$ROOT"
        } 
    }
]

db.getCollection(collection).updateMany({}, agg_query, {upsert: true})