MongoDB中如何基于值数组高效批量创建多个文档
基于值数组批量创建Mongoose文档的实现方案
你当前逐个遍历调用create的写法存在两个明显缺陷:
- 遍历生成的多个异步Promise没有被统一等待,外层逻辑无法感知所有文档是否插入完成,也无法捕获插入过程中抛出的异常,容易出现数据不一致问题
- 每插入一个文档就发起一次数据库请求,网络IO开销高,数据量大时性能表现很差
推荐实现方式
Mongoose的Model.create()原生支持传入文档数组实现批量插入,仅需和数据库交互一次即可完成所有文档写入,性能远高于逐个插入,且会完整触发Schema校验、预定义的模型中间件,和你现有tagSchema的规则完全兼容:
// 先组装所有待插入的文档结构 const insertData = tags.map(tag => ({ tag, postID })) // 等待批量插入完成,拿到所有创建成功的文档结果 const createdTagList = await TagModel.create(insertData)
更高性能的可选方案
如果你不需要触发Mongoose的文档校验、模型钩子逻辑,追求极致的插入性能,可以使用insertMany方法:
// ordered: false 表示无序并行插入,单个文档失败不会中断剩余文档的写入 const createdTagList = await TagModel.insertMany(insertData, { ordered: false })
如果需要严格按照数组顺序插入、遇到插入错误立刻终止流程,去掉ordered配置即可,默认值为true。
原写法的纠错参考
如果你因为特殊场景必须逐个插入文档,也需要用Promise.all包裹所有异步任务,避免出现未捕获的Promise异常:
// 不推荐,仅作写法纠错使用,性能远低于批量插入 const createdTagList = await Promise.all( tags.map(tag => TagModel.create({ tag, postID })) )
内容的提问来源于stack exchange,提问作者Aksabar Accelerating
相关产品推荐
相关产品推荐

