我正在尝试使用node-cron用猫鼬更新多个文档。我要完成的工作是创建的所有文档(例如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中的多个文档吗?如果我的问题令人困惑,请原谅我。

最佳答案

在这里,您可以找到完整版本的代码。


  在这里,您无需进行多个查询,例如先选择全部
  当前日期符合您条件的产品。原因是
  您可以在更新产品本身的同时进行。


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更新是成功还是失败。因此,可以更好地控制代码。而不是循环进行多个呼叫。那将非常耗时且容易出错。

希望这可以帮助!

关于node.js - 使用node-cron用 Mongoose 更新多个文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44917031/

10-16 14:16