【问题标题】:How to use mongoose updateMany middleware to increase performance?如何使用 mongoose updateMany 中间件提高性能?
【发布时间】:2021-11-16 21:02:45
【问题描述】:

已解决:底部的解决方案

我有以下代码逐个元素更新:

//registerCustomers.js
const CustomerRegistrationCode = require("../models/CustomerRegistrationCode");

const setRegCodesToUsed = async (regCodes) => {
  for (let regCode of regCodes) {
    await setRegCodeToUsed(regCode._id);
  }
};

const setRegCodeToUsed = async (id) => {
  await CustomerRegistrationCode.findByIdAndUpdate(id, { used: true });
};

代码运行良好,但速度较慢,我想一次更新许多 (1000) 个 CustomerRegistrationCode。 我查看了 updateMany 中间件功能,但在网上和官方文档上发现的信息不多。我将代码更改为以下内容,但不知道如何进一步。

//registerCustomers.js
const setRegCodesToUsed = async (regCodes) => {
  await CustomerRegistrationCode.updateMany(regCodes);
}
//CustomerRegistrationCode.js
CustomerRegistrationCodeSchema.pre('updateMany', async function (next, a) {
  console.log('amount arguments: ', arguments.length); //is 2
  console.log(arguments); //both parameters are functions.
  next();
});

用 1000 个不同的 id 更新许多 CustomerRegistrationCode 的最佳方法是什么?

解决方案,感谢 Murat Colyaran

const setRegCodesToUsed = async (regCodes) => {
  const ids = [];
  regCodes.map(code => ids.push(code._id));
  await setRegCodeToUsed(ids);
};

const setRegCodeToUsed = async (ids) => {
  await CustomerRegistrationCode.updateMany(
    { _id: { $in: ids } },
    { used: true }
  );
};

【问题讨论】:

    标签: javascript node.js mongoose middleware mongoose-schema


    【解决方案1】:

    这应该可行:

    //registerCustomers.js
    const CustomerRegistrationCode = require("../models/CustomerRegistrationCode");
    
    const setRegCodesToUsed = async (regCodes) => {
        let ids = [];
        regCodes.map((code) => ids.push(code._id.toString()));
        await setRegCodeToUsed(ids);
    };
    
    const setRegCodeToUsed = async (ids) => {
        await CustomerRegistrationCode.updateMany(
            { 
                id : { $in: ids }
            },
            {
                used: true
            }
        );
    };
    
    

    我们只是解析 id 并使用 $in 发送批量请求,而不是为每条记录发送查询

    【讨论】:

    • 我不得不说:Murat.insertMany(谢谢)。我不得不将 id 参数更改为 _id 并在此处发布改进后的帖子 :)
    • @swftowu69 很高兴听到。欢迎您!
    猜你喜欢
    • 2018-07-15
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2021-12-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多