You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Golang实现MongoDB批量插入及存在即更新操作

Go 实现 MongoDB 批量操作(含批量 upsert 场景)

前置依赖

使用 MongoDB 官方 Go 驱动,安装命令:

go get go.mongodb.org/mongo-driver/mongo

1. 对应你给出的 Node.js 示例的 Go 实现

你给出的 Node.js 是对 items 集合做无序批量更新,对应 Go 代码如下:

package main

import (
	"context"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
	// 建立Mongo连接
	ctx := context.TODO()
	client, err := mongo.Connect(ctx, options.Client().ApplyURI("你的Mongo连接地址"))
	if err != nil {
		panic(err)
	}
	defer client.Disconnect(ctx)

	coll := client.Database("你的库名").Collection("items")

	// 构造批量操作列表
	writeModels := []mongo.WriteModel{
		// 对应第一条更新:status为D的记录更新status和points
		mongo.NewUpdateManyModel().
			SetFilter(bson.M{"status": "D"}).
			SetUpdate(bson.M{"$set": bson.M{"status": "I", "points": "0"}}),
		// 对应第二条更新:item为null的记录更新item为TBD
		mongo.NewUpdateManyModel().
			SetFilter(bson.M{"item": nil}).
			SetUpdate(bson.M{"$set": bson.M{"item": "TBD"}}),
	}

	// 执行无序批量操作,和Node.js的initializeUnorderedBulkOp效果一致
	bulkOpts := options.BulkWrite().SetOrdered(false)
	_, err = coll.BulkWrite(ctx, writeModels, bulkOpts)
	if err != nil {
		panic(err)
	}
}

2. 你需要的 users 集合批量 upsert 实现

要求 email 为唯一键,不存在则插入、已存在则更新,使用UpdateOneModel开启Upsert即可,示例如下:

// 假设你要批量写入的用户数据结构如下
type User struct {
	Email string `bson:"email"`
	Name  string `bson:"name"`
	Age   int    `bson:"age"`
}

func bulkUpsertUsers(ctx context.Context, coll *mongo.Collection, users []User) error {
	writeModels := make([]mongo.WriteModel, 0, len(users))
	for _, user := range users {
		// 过滤条件:匹配email
		filter := bson.M{"email": user.Email}
		// 更新内容:全量覆盖字段,也可以按需只传要更新的字段
		update := bson.M{"$set": user}
		// 构造单条upsert操作
		model := mongo.NewUpdateOneModel().
			SetFilter(filter).
			SetUpdate(update).
			SetUpsert(true) // 开启upsert,不存在则插入
		writeModels = append(writeModels, model)
	}

	// 执行批量操作,Ordered设为false的话单条操作失败不会终止后续操作
	_, err := coll.BulkWrite(ctx, writeModels, options.BulkWrite().SetOrdered(false))
	return err
}

注意事项

  • 你需要提前给users集合的email字段建立唯一索引,避免重复数据写入
  • 如果需要有序批量操作,把SetOrdered的参数改为true即可,此时某条操作失败后会直接终止后续所有操作

内容的提问来源于stack exchange,提问作者Vikram Biwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:03