使用Golang实现MongoDB的批量写入操作
使用Golang实现MongoDB的批量写入操作 我正在尝试使用新的MongoDB驱动进行批量写入操作。
models := []mongo.WriteModel{}
for i := 0; i <= 3; i++{
models = append(models, mongo.NewInsertOneModel().SetDocument(bson.M{
"language":"es",
"devideType":i,
}))
}
_, err := client.Database("mydb").Collection("mycoll").BulkWrite(context.TODO(), models)
if err != nil{
log.Println(err)
}
// len(models) - 1, 2, 3.
当我查看切片中有多少项时,我得到的是1、2、3。所以总共是6项,但本应只有3项。
这插入了6项而不是3项,我不确定如何修复这个问题。
虽然可以使用InsertMany方法,但必须使用BulkWrite。
更多关于使用Golang实现MongoDB的批量写入操作的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
我一开始完全搞不懂为什么会发生这种情况,因为现在它似乎运行正常了。也许有人知道原因……
更多关于使用Golang实现MongoDB的批量写入操作的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
从你的代码来看,问题出在循环条件 i <= 3 上。这会导致循环执行4次(i=0,1,2,3),而不是你期望的3次。此外,你提到切片长度显示为1、2、3,这可能是因为你在循环中打印了 len(models),而每次迭代都会增加切片长度。
以下是修正后的代码:
models := []mongo.WriteModel{}
for i := 0; i < 3; i++ { // 使用 i < 3 而不是 i <= 3
models = append(models, mongo.NewInsertOneModel().SetDocument(bson.M{
"language": "es",
"deviceType": i, // 修正拼写:devideType -> deviceType
}))
}
// 验证模型数量
fmt.Printf("准备插入 %d 个文档\n", len(models))
result, err := client.Database("mydb").Collection("mycoll").BulkWrite(context.TODO(), models)
if err != nil {
log.Fatal(err)
}
fmt.Printf("成功插入 %d 个文档\n", result.InsertedCount)
如果你需要更复杂的批量操作,可以混合使用不同的写入模型:
models := []mongo.WriteModel{
mongo.NewInsertOneModel().SetDocument(bson.M{"name": "doc1", "value": 1}),
mongo.NewUpdateOneModel().
SetFilter(bson.M{"name": "doc2"}).
SetUpdate(bson.M{"$set": bson.M{"value": 2}}),
mongo.NewDeleteOneModel().SetFilter(bson.M{"name": "doc3"}),
}
result, err := client.Database("mydb").Collection("mycoll").BulkWrite(
context.TODO(),
models,
options.BulkWrite().SetOrdered(false), // 无序执行以提高性能
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("操作结果: 插入=%d, 更新=%d, 删除=%d\n",
result.InsertedCount,
result.ModifiedCount,
result.DeletedCount)
对于大量数据的批量写入,建议使用分批次处理:
batchSize := 1000
for i := 0; i < totalDocuments; i += batchSize {
end := i + batchSize
if end > totalDocuments {
end = totalDocuments
}
models := []mongo.WriteModel{}
for j := i; j < end; j++ {
models = append(models, mongo.NewInsertOneModel().SetDocument(bson.M{
"index": j,
"data": fmt.Sprintf("document_%d", j),
}))
}
_, err := client.Database("mydb").Collection("mycoll").BulkWrite(
context.TODO(),
models,
options.BulkWrite().SetOrdered(false),
)
if err != nil {
log.Printf("批次 %d-%d 插入失败: %v", i, end-1, err)
}
}

