【问题标题】:Mongoose : Update large amount of dataMongoose:更新大量数据
【发布时间】:2018-09-02 02:05:30
【问题描述】:

所以,这是我的问题。我有两个集合(coll1、coll2),其中包含大约 150 万个具有相同字段的文档。他们有超过 95% 的共同文档,但一些 coll1 文档的电子邮件填写不为空,而 coll2 的文档更多。

我想要的最终集合是 coll2,但带有 coll1 的电子邮件。

我是怎么做的:

 const options = {
  socketTimeoutMS: 0,
  keepAlive: true,
  reconnectTries: 30,
};
mongoose.connect(`mongodb://localhost:27017/coll1`, options);

const Coll1Model = mongoose.model(coll, collSchema);

Coll1Model.find({ email: { $ne: '' } })
  .select({ id: 1, email: 1, _id: 0 })
  .then((result) => {
    const Coll2Model = mongoose.model(coll2, collSchema);

    const bulk = Coll2Model.collection.initializeUnorderedBulkOp();
    // c is about 390k
    const c = result.length;
    for (let i = 0; i < c; i += 1) {
      bulk.find({ id: result[i].id }).updateOne({ $set: { email: result[i].email } });
    }
    bulk
      .execute()
      .then((result) => {
        console.log(result);
        console.log('End', new Date());
      })
      .catch((err) => {
        console.log(err);
        console.log('End', new Date());
      });
  })
  .catch((err) => {
    console.log('Error', err);
  });

我遇到的问题是它太长而且太耗费资源(20% 大约需要 1 小时 30 分钟,cpu 在 60% 到 80% 之间)

我远不是 MongoDB 和 mongoose 方面的专家,所以如果有人想以更好的方式来做这件事,我会很高兴。

【问题讨论】:

标签: node.js mongodb mongoose bigdata


【解决方案1】:

我设法通过索引将时间从 4-5 小时减少到 2-3 分钟。

db.coll2.createIndex({id: 1}, function(err, col) {
  var bulk = db.coll2.initializeUnorderedBulkOp();

  db.coll1.find({ email: { $ne: '' } }).forEach(function(data) {
    bulk.find({ id: data.id }).updateOne({ $set: { email: data.email } 
    });
  });

  bulk.execute();
}

在命令行中执行:mongo mydb update.js

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2015-03-28
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多