检查日期到期的Cron作业

时间:2017-11-06 09:16:34

标签: node.js mongodb cron

我们来看下面的例子:

我有两个名为mongoDbuser的{​​{1}}个集合。用户可以添加无限制的产品,但每个产品在5天后到期,并且必须在数据库到期时从数据库中动态删除。

user.js的

products

products.js

const UserSchema = mongoose.Schema(
  {
    username: { type: String },
    email: { type: String },
    timezone: { type: String },
    products: [{ type: Schema.Types.ObjectId, ref: 'Products' }]
  }
)

export default mongoose.model('User', UserSchema);

是否有另一种方法在nodejs中执行此操作,而不是每天运行一个var RunSchema = mongoose.Schema( { name: { type: String }, completedAt: { type: Date } } ) export default mongoose.model('Run', RunSchema); 并检查cron job集合中的所有文档?

我正在考虑一个解决方案,每个用户都可以拥有一个在添加产品后启动的cron作业......

2 个答案:

答案 0 :(得分:2)

尽管现在回答问题为时已晚,我想以最少的操作和没有 Cron Job

如果您想在创建 5 天间隔后删除产品文档,那么您可以在模型本身中使用 2 行代码来实现。 您在模型中添加了一个属性,即(expireAt) 并在 moment npm 库

的帮助下将间隔传递给该属性
    var RunSchema = mongoose.Schema(
  {
    name: { type: String },
    completedAt: { type: Date },
    expireAt: {
         type: Date,
         default: moment(new Date()).add("5", "days"),
         expires: 432000000
   }
  }
)

export default mongoose.model('Run', RunSchema);

在创建产品文档日期和时间之后。它会每隔 5 天自动从集合中删除文档。

答案 1 :(得分:1)

第一种方法:

您可以在NodeJ中添加一个cron,它将每x执行一次任务

示例:

在项目中添加包cron

npm i cron -S

创建文件cron.js

'use strict';

 let express = require('express'),
 CronJob = require('cron').CronJob,
 moment = require('moment'),
 mongoose = require('mongoose');
 Collection = mongoose.model('Collection');

var collection = {

    clean : function() {
        // Each hour
        new CronJob('0 * * * *', function() {

          console.log("Hello I'm Cron!");

           // Delete all the product expired of your db
           // Your code ...

        }, null, true, 'Europe/Paris');
    }

}

module.exports = {
    init : function() {
        return (
            collection.clean()
        )
    }
}

在您的server.js中,添加以下代码以初始化cron

/**
 * Init cron tasks
 */

var cron = require('./cron');
cron.init()

第二种方法:

在模型中设置到期时间,检查answer以获取更多信息。