【发布时间】: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 方面的专家,所以如果有人想以更好的方式来做这件事,我会很高兴。
【问题讨论】:
-
我试过这个:jsfiddle.net/5aj6j10m 并通过 mongo mydb update.js 执行它,但它仍然太长了。
标签: node.js mongodb mongoose bigdata