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

Sad*_*mar 20 mongodb morphia

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

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

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

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

Ram*_*esh 15

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

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

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

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


Thi*_*ilo 7

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

  • 不是真的.MongoDB确实存储了createdTime,我们可以通过ObjectId("theIdofThedocumen")访问它.getTimeStamp() (8认同)
  • 哦,是的,你当然是对的.但我认为如果我们不覆盖_id总会更好...... (3认同)
  • **对象创建时间戳**,正如@AminMohamedAjani所述,[ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()](https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/#example)有效,但它是对象创建时间戳。 (2认同)

xer*_*raa 5

您可以使用@user1530669 提到的审计跟踪实体(我正在调用我的增量 - 代码已经在 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();
}
Run Code Online (Sandbox Code Playgroud)

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