MongoDB:自动捕获数据库(而不是应用程序)中创建/更新的时间

时间:2017-03-06 06:33:16

标签: mongodb

我想捕获插入到MongoDB数据库中的文档的插入和更新。对于插入,可以这样做,因为文档创建时间是在ObjectID中编码的。

例如,我可以插入文档:

notificationManager.notify(notifyId, builder.build());
notifyId++;

...然后检索该文档的时间戳:

> db.test.insertOne(
...    { docnum: 1}
... )
{
    "acknowledged" : true,
    "insertedId" : ObjectId("58bcee87fcf4a79f8157dfad")
}

如果我然后更新该文件:

> ObjectId("58bcee87fcf4a79f8157dfad").getTimestamp()
ISODate("2017-03-06T05:07:19Z")

...文档时间戳不会更改,因为时间戳是创建时间戳而不是上次更新的时间戳:

> db.test.updateOne(
...    { docnum: 1 },
...    {
...      $set: { "text": "Some text." }
...    }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

一个明显的解决方案是更改应用程序以包含更新的时间戳。在这种情况下,我不控制应用程序,只控制MongoDB。

如果是MySQL,可以添加更新/创建的时间戳:

> db.test.find()
{ "_id" : ObjectId("58bcee87fcf4a79f8157dfad"), "docnum" : 1, "text" : "Some text." }

> ObjectId("58bcee87fcf4a79f8157dfad").getTimestamp()
ISODate("2017-03-06T05:07:19Z")

MongoDB是否与此相当?我读到MongoDB不支持触发器或存储过程,但我很想知道是否有常用的解决方法/黑客来执行此操作。

1 个答案:

答案 0 :(得分:0)

MongoDB本身不保存任何时间戳。如果您使用的是Mongoose,则可以指定在创建/更新

上存储时间戳
var thingSchema = new Schema({..}, { timestamps: true });

http://mongoosejs.com/docs/guide.html#timestamps