【发布时间】:2021-03-22 08:22:27
【问题描述】:
我有一个使用 Mongoose/MongoDB 的 Express 应用程序,我希望找到最有效的批量创建/更新方法(如果可能,全部在单个数据库操作中进行?)。
用户在前端上传 CSV,该 CSV 将转换为 JSON 对象数组并发送到 Express 后端。该数组的范围从 ~3000 个条目到 ~50,000 个以上,并且通常是需要创建的 新 条目以及需要更新的 现有 条目的组合.每个条目称为一个交易。
这是我目前(不是很高效)的解决方案:
const deals = [
{ deal_id: '887713', foo: 'data', bar: 'data' },
{ deal_id: '922257', foo: 'data', bar: 'data' }
] // each deal contains 5 key/value pairs in the real data array
const len = deals.length
const Model = models.Deal
let created = 0
let updated = 0
let errors = 0
for (let i = 0; i < len; i++) {
const deal = deals[i]
const exists = await Model.findOne({ deal_id: deal.deal_id })
if (exists) {
exists.foo = deal.foo
exists.bar = deal.bar
await exists.save()
updated += 1
} else {
try {
await Model.create(deal)
created += 1
} catch (e) {
errors += 1
}
}
}
目前 findOne/save 或 findOne/create 的组合每次交易大约需要 200-300 毫秒。对于 3000 个条目的低端,需要 10-15 分钟来处理。
如果有帮助,我对绕过 Mongoose 并直接使用 Mongo 并不公正。
如果可能,我希望保持计算更新和创建的项目数量以及错误数量的能力(这在响应中发送以向用户提供一些成功和失败的感觉) - 但这并不重要。
提前致谢! :)
【问题讨论】:
标签: node.js mongodb express mongoose