如何在Golang中通过单查询基于不同_id更新MongoDB多条记录?
问题解答
1. 能不能用InsertMany完成指定的更新操作?
不行。InsertMany主要用来插入新文档,根本没法修改已经存在的文档。就算开了upsert选项,也只会在文档不存在的时候插入,存在的话要么跳过要么替换,完全做不到给每个已有文档自定义更新值的逻辑。你的需求是修改已有文档的status字段,所以InsertMany根本不适用。
2. 怎么用Golang的MongoDB驱动实现批量自定义更新?
UpdateMany方法是给所有匹配filter的文档用完全一样的更新规则,没法给每个文档设置不同的status值。要实现每个_id对应不同status的批量更新,得用BulkWrite方法,它支持批量执行多个独立的更新操作。
代码示例:
import ( "context" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func batchUpdateStatus(collection *mongo.Collection) error { // 定义每个文档的更新任务 updateRequests := []mongo.WriteModel{ mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 1}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A0"}}), mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 2}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A1"}}), mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 3}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A2"}}), mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 4}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A3"}}), mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 5}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A4"}}), mongo.NewUpdateOneModel(). SetFilter(bson.M{"_id": 6}). SetUpdate(bson.M{"$set": bson.M{"status": "P0-A5"}}), } // 执行批量写入 opts := options.BulkWrite().SetOrdered(true) // 按顺序执行,出错就停 result, err := collection.BulkWrite(context.TODO(), updateRequests, opts) if err != nil { return err } // 可以打印更新结果,比如看看改了多少个文档 // fmt.Printf("更新了 %d 个文档\n", result.ModifiedCount) return nil }
额外说明:
- 要是硬要用
UpdateMany,只能给某一批_id设置同一个status,比如把_id在[1,2,3]的文档都改成同一个值,这显然不符合你要每个文档对应不同status的需求。 BulkWrite里的SetOrdered(true)是说按顺序执行请求,要是中间某一步出错就停下来;如果改成false,就算某一步错了,剩下的请求还是会继续执行,适合不在乎执行顺序的场景。
内容的提问来源于stack exchange,提问作者haroldcampbell
相关产品推荐
相关产品推荐

