【问题标题】:Cron job that checks for date expiration检查日期到期的 Cron 作业
【发布时间】:2018-04-18 09:44:21
【问题描述】:

我们来看下面的例子:

我有两个名为 userproductsmongoDb 集合。用户可以添加无限的产品,但每个产品在 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 job 每天运行并检查 products 集合中的所有文档?

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

【问题讨论】:

标签: node.js mongodb cron


【解决方案1】:

现在回答这个问题为时已晚,我想以最少的操作和没有 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 天自动从集合中删除文档。

【讨论】:

    【解决方案2】:

    第一种方法:

    您可以在 NodeJs 中添加一个 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 了解更多信息。

    【讨论】:

    • 第二种方法似乎正是我所需要的,但是当产品过期时,我还必须从user 集合中删除它的引用......任何想法我怎么能用这个来做到这一点方法?
    • 在链接的答案中,您有一个答案的开始,重新加工您的 2 个模型并添加额外的检查或执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多