我尝试使用node-cron使用mongoose更新多个文档。我想要完成的是所有创建的文档,比如7月1日,将在30天后处于非活动状态。
我设法使用下面的代码更新多个文档,但我不知道如何使用日期小于当前日期的产品更新多个文档:
我知道如何获取小于当前日期的产品列表,但我不知道如何将此逻辑应用于以下代码 -
let currentDate = new Date();
let query = Product.find({ dateCreated: {$lt: currentDate}});
代码与我想要完成的事情无关。这是一个样本 代码将每10秒更新一次文档。
const mongoose = require('mongoose');
const Product = require('../model/product');
const cron = require('node-cron');
cron.schedule('*/10 * * * * *', function(){
let productArray = ['Bacon', 'Apple', 'Fork', 'Beans'];
productArray.map(product => updateProduct(product));
});
let updateProduct = (name) => {
let randomNumber = Math.floor(Math.random() * (999 - 1 + 1));
let query = Product.findOne({name: name}).select({ 'name': 1 });
query.exec((err, product) => {
if(err) throw err;
if(product){
product.description = `Random description generate every 10 seconds: ${randomNumber}`;
product.save(err =>{
if(err) throw err;
console.log(`Successfully updated random description for: ${product.name}\n ${product.description}\n`);
});
}
});
};
产品架构
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const productSchema = mongoose.Schema({
name : String,
description : String,
status : String,
dateCreated : { type: Date, default: Date.now }, //
});
module.exports = mongoose.model( 'Product', productSchema );
这是我知道在mongoose中更新多个文档的唯一方法。那么有没有其他方法在使用mongoose和node-cron创建30天后在mongoose中更新多个文档?如果我的问题令人困惑,请原谅我。
答案 0 :(得分:2)
这里是完整版代码。
在这里您无需进行多次查询,例如首先选择所有查询 当前日期符合您标准的产品。原因 你可以在更新产品的同时做到。
const mongoose = require('mongoose');
const Product = require('../model/product');
const cron = require('node-cron');
cron.schedule('*/10 * * * * *', function() {
let productArray = ['Bacon', 'Apple', 'Fork', 'Beans'];
updateAllProducts(productArray, (err, res) => {
if (err)
//error handle, you can log here
else
//success handle, you can log here
})
});
let updateAllProducts = (productArray, callbackFn) => {
let randomNumber = Math.floor(Math.random() * (999 - 1 + 1));
description = `Random description generate every 10 seconds: ${randomNumber}`;
Product.update({
name: {
$in: productArray
},
dateCreated: {
$lt: currentDate
}
}, {
description: description
}, {
multi: true
}, (err, res) => {
if (err) {
callbackFn(err, null)
} else {
callbackFn(null, err);
}
});
};
在这种情况下,您还可以记录Db更新是失败还是成功。因此可以更好地控制代码。而不是在循环中进行多个调用。那将是非常耗时且容易出错的。
希望这有帮助!