【发布时间】:2021-01-07 17:14:02
【问题描述】:
我有一个包含大约 50 000 个条目的集合,其中包含一些字段。
它们两者的组合是uniq(一个ObjectID和一个字符串)。
我需要大约 15 秒来更新 500 个条目。有没有办法更快地完成它? 我尝试在使用nestJS 的集合上使用bulkWrite(带有ordered:false)而不是多个updateOne(),但没有任何收获。
myObjects.forEach(objects => {
const upsertDoc = {
updateOne: {
filter: { someOid: myOid, someString: myString },
update: { $set: myObject },
upsert: true,
},
};
bulkOps.push(upsertDoc);
}
myModel.collection.bulkWrite(bulkOps, { ordered: false });
我尝试使用空集合,它的速度更快(200 毫秒),我猜这是过滤器部分花费的时间太长。
【问题讨论】:
-
upserting时判断数据库是cpu绑定还是磁盘绑定。
-
用
explain检查一次updateOne调用。 -
也许你的
.forEach()是慢的部分,而不是批量更新。 -
图表显示 mongoDB 既不受 CPU 限制,也不受磁盘限制,对于每个,它在不到一秒的时间内完成,mongoDB 日志每次批量更新大约需要 14500 秒
-
我们能看到那个日志条目吗?
标签: mongodb mongoose nestjs bulk