如何在Golang中读取*mongo.UpdateResult类型数据(UpdateOne、$addToSet)
处理Go MongoDB驱动中UpdateOne返回的*mongo.UpdateResult类型数据
你遇到的问题核心是不了解*mongo.UpdateResult结构体的公开字段含义,其实可以直接通过结构体字段访问来区分你遇到的三种场景。
*mongo.UpdateResult的核心字段说明
UpdateResult是Go MongoDB驱动封装的更新结果结构体,关键公开字段如下:
MatchedCount:符合查询条件的文档数量ModifiedCount:实际被修改的文档数量(对于$addToSet操作,只有当元素不存在时才会计数)UpsertedCount:使用upsert选项时,新插入的文档数量(你的场景未用到,所以始终为0)
对应你的三个场景的字段值解读
- 未找到记录:
MatchedCount=0,ModifiedCount=0→ 没有匹配到指定ID的文档 - 找到记录且元素添加成功:
MatchedCount=1,ModifiedCount=1→ 匹配到文档,且paid数组中不存在该YYYYmm值,成功添加 - 找到记录但元素已存在:
MatchedCount=1,ModifiedCount=0→ 匹配到文档,但paid数组中已有该值,未执行修改
优化后的代码示例(包含场景处理)
你可以通过读取上述字段来区分不同场景,同时建议不要用log.Fatal直接终止程序,而是将错误返回给调用者处理:
import ( "context" "errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" ) func AddPaidByYYYYmm(id string, YYYYmm string) (int, error) { ctx := context.Background() _id, err := primitive.ObjectIDFromHex(id) if err != nil { return 0, err } if !CheckYearMonthFormat(YYYYmm) { return 0, errors.New("ill-formed date format; must be YYYY-mm") } result, err := collection.UpdateOne(ctx, bson.M{"_id": _id}, bson.M{"$addToSet": bson.M{"paid": YYYYmm}}) if err != nil { return 0, err } // 场景1:未找到匹配文档 if result.MatchedCount == 0 { return 0, errors.New("no document matched id") } // 场景3:元素已存在,未修改 if result.ModifiedCount == 0 { return 0, errors.New("year-month entry already exists in paid array") } // 场景2:成功添加元素 return 1, nil }
读取字段的方式
直接通过.运算符访问结构体的公开字段即可,比如result.MatchedCount、result.ModifiedCount,这些字段都是int64类型,可以直接用于判断和比较。
内容的提问来源于stack exchange,提问作者sivs
相关产品推荐
相关产品推荐

