1

我正在尝试使用 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 和 node-cron 创建 30 天后更新 mongoose 中的多个文档?如果我的问题令人困惑,请原谅我。

4

1 回答 1

3

这是完整版的代码。

在这里您无需进行多次查询,例如首先选择当前日期符合您条件的所有产品。因为您可以在更新产品本身时执行此操作。

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);
        }

    });

};

在这种情况下,您还可以记录数据库更新是失败还是成功。所以对代码有更好的控制。而不是在循环中进行多次调用。这将非常耗时且容易出错。

希望这可以帮助!

于 2017-07-05T05:04:18.010 回答