【问题标题】:How to retrieve last update time of each document in MongoDB?如何检索 MongoDB 中每个文档的最后更新时间?
【发布时间】:2012-12-07 18:26:18
【问题描述】:

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

是否有任何方法可以在 MongoDB 中检索最后修改的时间戳?

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

我正在使用morphia作为java驱动,所以如果morphia有任何可能的方法,请告诉我。

【问题讨论】:

标签: mongodb morphia


【解决方案1】:

您可以执行以下操作。使用 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})

【讨论】:

    【解决方案2】:

    您可以使用@user1530669 提到的审计跟踪实体(我正在调用我的 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】:

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

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

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

      这个实际花费了很少的时间来实施,但提供了获取最后更新时间的能力,以及您可能需要的任何其他信息,以确保 Mongo 中所有内容的安全和客户支持。

      【讨论】:

      • 不——只是在我的 DAO 框架中。我还没有考虑向社区发布我的代码。我没有任何问题,只是从未想过。
      【解决方案4】:

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

      【讨论】:

      • 不完全正确。 MongoDB 确实存储 createdTime .. 我们可以通过 ObjectId("theIdofThedocumen").getTimeStamp() 访问它
      • @AminMohamedAjani:仅当您使用在文档创建时为 _id 字段创建的 ObjectId 时(您不必这样做)。
      • 哦,是的,当然你是对的。但我认为如果我们不覆盖 _id...
      • 对象创建时间戳,正如@AminMohamedAjani 所述,ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp() 有效,但它是对象创建时间戳。
      猜你喜欢
      • 2018-05-20
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多