如何使用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
相关产品推荐
相关产品推荐

