You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中读取*mongo.UpdateResult类型数据(UpdateOne、$addToSet)

处理Go MongoDB驱动中UpdateOne返回的*mongo.UpdateResult类型数据

你遇到的问题核心是不了解*mongo.UpdateResult结构体的公开字段含义,其实可以直接通过结构体字段访问来区分你遇到的三种场景。

*mongo.UpdateResult的核心字段说明

UpdateResult是Go MongoDB驱动封装的更新结果结构体,关键公开字段如下:

  • MatchedCount:符合查询条件的文档数量
  • ModifiedCount:实际被修改的文档数量(对于$addToSet操作,只有当元素不存在时才会计数)
  • UpsertedCount:使用upsert选项时,新插入的文档数量(你的场景未用到,所以始终为0)

对应你的三个场景的字段值解读

  1. 未找到记录:MatchedCount=0,ModifiedCount=0 → 没有匹配到指定ID的文档
  2. 找到记录且元素添加成功:MatchedCount=1,ModifiedCount=1 → 匹配到文档,且paid数组中不存在该YYYYmm值,成功添加
  3. 找到记录但元素已存在: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:43:20