【问题标题】:How to delete mongoose's documents older than 24 hours in express js server?如何删除 express js 服务器中超过 24 小时的 mongoose 文档?
【发布时间】:2018-01-14 22:09:32
【问题描述】:

我正在编写一个使用 ExpressJS 服务器和猫鼬来处理 MongoDB 的应用程序。

我将从外部传感器接收一些测量值,并将它们存储在数据库中。我将只使用过去 24 小时的测量值。

有没有办法以某种方式从 Mongo 中自动删除超过 24 小时的文档?每个测量文档都会有一个名为 createdAt 的字段,其中包含创建它的确切日期。

谢谢!

【问题讨论】:

标签: node.js mongodb express mongoose


【解决方案1】:

您可以在您的集合中的日期字段(如createdOnaddedOn)上使用生存时间(TTL)索引,到期秒数,即使您插入的文档也应该有这个字段与当前系统时间new Date()

文件过期秒后会在后台自动删除

TTL index

在日期字段上创建索引

> db.sensor.ensureIndex({'addedOn' : 1} , { expireAfterSeconds: 24*60*60 // 1 day})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

索引

> db.sensor.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.sensor"
    },
    {
        "v" : 2,
        "key" : {
            "addedOn" : 1
        },
        "name" : "addedOn_1",
        "ns" : "test.sensor",
        "expireAfterSeconds" : 86400
    }
]
> 

示例(20 秒后过期)

插入集合

> db.sensor.insert({machineId : 'dc-rack123-1243', addedOn : new Date()})
WriteResult({ "nInserted" : 1 })
> 

系统时间

> new Date()
ISODate("2018-01-14T14:05:18.008Z")
> 

文档

> db.sensor.find()
{ "_id" : ObjectId("5a5b639942005c0824b9c983"), "machineId" : "dc-rack123-1243", "addedOn" : ISODate("2018-01-14T14:05:13.064Z") }
> 

20+秒后,文档从集合中删除

> new Date()
ISODate("2018-01-14T14:08:39.436Z")
> db.sensor.find()
> 

【讨论】:

  • 这段代码进入mongo 本身,对吗?我是否在 db 终端中指定它一次并且我很好?或者我应该以某种方式在代码中实现它?
  • 是的,我们需要在服务器端对集合进行索引,在 TTL 之后文档将被守护进程删除,确保我们插入的所有文档都应该有日期或时间戳字段来表示插入时间并被索引
  • 对于日期或时间戳字段,您可以设置默认的currentDate值,请参阅docs.mongodb.com/manual/reference/operator/update/currentDate/…
猜你喜欢
  • 2017-04-21
  • 2015-03-27
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多