node.js - 如何删除 express js 服务器中超过 24 小时的 Mongoose 文档?

标签 node.js mongodb express mongoose

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

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

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

谢谢!

最佳答案

您可以在日期字段上使用生存时间 (TTL) 索引,例如 createdOnaddedOn 在您的集合中使用过期秒数,您插入的每个文档都应该有此字段包含当前系统时间 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()
> 

关于node.js - 如何删除 express js 服务器中超过 24 小时的 Mongoose 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48249724/

相关文章:

javascript - 循环直到在 javascript 中接收到所有事件

node.js - npm 错误!代码 EMFILE npm ERR!系统调用产生 git npm ERR!路径 git npm ERR!错误号 EMFILE npm 错误!生成 git EMFILE

javascript - Express 4.x bodyparser 不工作

node.js mongoose 删除不在这些文档的当前列表中的保留文档的子集

mongodb - ReplaceOne 抛出重复键异常

node.js - 从 Angular 向服务器发送数据时请求正文为空

node.js - 为什么总是生成像 npm-debug.log.(number) 这样的文件

mongodb - 如何在 Meteor 中读取依赖于另一个集合的集合

javascript - 对象 #<IncomingMessage> 没有方法 'post'

javascript - 如何从node.js中的模块导出函数