我们来看下面的例子:
我有两个名为mongoDb
和user
的{{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作业......
答案 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以获取更多信息。