[英]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.