Node.js 检查日期过期的Cron作业

Node.js 检查日期过期的Cron作业,node.js,mongodb,cron,Node.js,Mongodb,Cron,让我们以下面的例子为例: 我有两个名为user和产品的mongoDb集合。用户可以添加无限的产品,但每个产品在5天内到期,到期时必须从数据库中动态删除 user.js const UserSchema = mongoose.Schema( { username: { type: String }, email: { type: String }, timezone: { type: String }, products: [{ type: Schema.Typ

让我们以下面的例子为例:

我有两个名为
user
产品的
mongoDb
集合。用户可以添加无限的产品,但每个产品在5天内到期,到期时必须从数据库中动态删除

user.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);
products.js

var RunSchema = mongoose.Schema(
  {
    name: { type: String },
    completedAt: { type: Date }
  }
)

export default mongoose.model('Run', RunSchema);
在nodejs中是否有其他方法可以做到这一点,而不是每天运行一个
cron作业
,检查
产品
集合中的所有文档

我正在考虑一个解决方案,其中每个用户都可以有一个cron作业,一旦他们添加了一个产品就可以开始…

第一种方法:

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

例如:

将包添加到项目中

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()
第二种方法:


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

回答问题为时已晚,尽管我希望提供具有最小操作和无Cron作业的替代操作

如果您希望在创建5天的间隔后删除产品文档,那么您可以在模型本身中使用2行代码来实现。 您已经在模型中添加了一个属性,即(expireAt),并在矩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天自动从集合中删除文档。

第二种方法似乎正是我所需要的,但当产品过期时,我还必须从
用户
集合中删除其引用。。。你知道我该如何使用这种方法吗?在答案链接中,你有一个答案的开头,修改你的两个模型,并添加额外的检查或执行。