javascript - Mongoose :findOneAndUpdate ~500k 文档

标签 javascript node.js mongodb mongoose

因为我想用 500k 条目更新整个文档集合(有些可能存在,有些不存在),我遍历我的文档(它们是来自 CSV 的普通 JS 对象)并通过 findOneAndUpdate 方法更新我的所有文档.

这是一个简化的 JS 代码:

const mongoose = require("mongoose");
const { mongoUrl } = require("../config.js");
const MyModel = require("../models/MyModel");

async function run() {
  mongoose.set("useCreateIndex", true);
  await mongoose.connect(mongoUrl, { useNewUrlParser: true });

  const r = [/* */]; // <-- Something with 500k objects

  const total = r.length;
  for (let i in r) {
    const e = r[i];
    e.REF = e.REF.trim();
    await MyModel.findOneAndUpdate({ REF: e.REF }, e, { upsert: true, new: true });
    if (i % 500 === 0) {
      console.log((i / total) * 100 + "%");
    }
  }
}

run();

第一次插入很快(每秒超过 500 个),但当达到 25% 时,它开始变得非常慢(500 个条目需要 10 秒或更长时间)。我认为它会慢一些(卡住?)接近 80%。

有没有更好的方法来做这样的事情?我怎样才能加快速度?

我的意思是,它只有 500k 个整体(有很多属性,但我认为这不重要)。

最佳答案

发表评论作为回答:

你有an index on REF吗?否则,数据库将不得不扫描整个集合,以确定是否存在具有相同 REF 的模型。

关于javascript - Mongoose :findOneAndUpdate ~500k 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998685/

相关文章:

node.js - Nodejs API - 使用 Passport JWT 策略进行身份验证与 jsonwebtoken

mongodb - 如何将 Lucene 查询转换为 Mongo 理解形式

python - 如何将元素推送到 MongoDB 中的现有数组?

javascript - 运行 mocha 测试但出现错误 : ReferenceError: document is not defined

javascript - 鼠标滚轮滚动事件

javascript - 在 asp.net 中检索 javascript 代码的客户端 ID 不起作用

javascript - Node.js 计划支持导入/导出 ES6 (ECMAScript 2015) 模块

node.js - 如何在loopback中制定API限速策略

javascript - HTML5 排序 DIV

node.js - 使用node.js和mongodb时调用createIndex函数的位置、时间和次数