Mongoose如何实现批量插入文档:已存在则跳过、不存在则写入
Mongoose 批量条件插入实现方案
前置配置:添加联合唯一索引
首先需要在对应的集合 Schema 中为 x 和 t 字段添加联合唯一索引,确保两个字段的组合值全局唯一:
const mongoose = require('mongoose'); // 定义集合Schema const dataSchema = new mongoose.Schema({ x: String, t: Number, s: String }); // 添加x、t联合唯一索引 dataSchema.index({ x: 1, t: 1 }, { unique: true }); const DataModel = mongoose.model('Data', dataSchema);
核心实现:使用 bulkWrite 批量条件插入
通过批量操作 bulkWrite 搭配 $setOnInsert 操作符实现需求,已存在的条目不会被修改,不存在的条目会自动插入:
const list = [ { x: "a", t: 1, s: 'new' }, { x: "a", t: 2, s: 'new' }, { x: "b", t: 2, s: 'new' }, { x: "b", t: 3, s: 'new' }, ]; // 构造批量操作数组 const bulkOperations = list.map(item => ({ updateOne: { // 匹配x、t字段均相等的条目 filter: { x: item.x, t: item.t }, // 仅当触发插入新条目时才赋值,已有条目不会被修改 update: { $setOnInsert: item }, // 不存在匹配条目时执行插入 upsert: true } })); // 执行批量操作 await DataModel.bulkWrite(bulkOperations);
方案说明
- 联合唯一索引从底层避免了
x、t组合重复的数据写入 $setOnInsert保证已有匹配条目不会被任何修改操作覆盖,完全保留原有旧数据- 批量操作相比循环单条插入性能提升明显,适合大批量数据写入场景
内容的提问来源于stack exchange,提问作者mehdi parastar
相关产品推荐
相关产品推荐

