如何使用 mongoose updateMany 中间件来提高性能?

swftowu69

已解决:底层解决方案

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

//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) 个 CustomerRegistrationCodes。我查看了 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 更新许多 CustomerRegistrationCodes 的最佳方法是什么?

解决方案,感谢 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 }
  );
};
穆拉特·科利亚兰

这应该有效:

//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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章