使用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)
    }
}
回到顶部