You need to enable JavaScript to run this app. Mongoose如何实现批量插入文档:已存在则跳过、不存在则写入
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 12:15:04