簡體   English   中英

貓鼬:更新大量數據

[英]Mongoose : Update large amount of data

所以,這是我的問題。 我有兩個集合(coll1,coll2),其中充滿了大約150萬個具有相同字段的文檔。 他們有超過95%的共同文檔,但是有些coll1文檔的電子郵件填寫不為null,而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%的時間約為1h30,而cpu在60%至80%之間)

我對MongoDB和Mongoose的了解還遠遠不夠,因此,如果有人有一個更好的想法,我會很高興。

我設法將索引的時間從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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM