为了账号安全,请及时绑定邮箱和手机立即绑定

MGO 驱动程序中的更新查询,适用于 bson.M,但不适用于客户结构

MGO 驱动程序中的更新查询,适用于 bson.M,但不适用于客户结构

Go
守着一只汪 2021-09-20 20:31:46
Mgo 和 golang 问题。我又遇到问题了。我尝试更新数据库中的记录,但运行简单命令visitors.UpdateId(v.Id, bson.M{"$set": zscore});wherezscore是 的变量type Zscore,不起作用。但是,如果我手动转换zscore为bson.M结构,则一切正常。有人知道如何使用 mgo 更新 mongodb 中的记录,而无需手动将结构值转储到 bson.M 中吗?例子:type Zscore struct {    a float64 `bson:"a,omitempty" json:"a"`    b float64 `bson:"b,omitempty" json:"b"`    c float64 `bson:"c,omitempty" json:"c"`}v := Visitor{}zscore := Zscore{}visitors := updater.C("visitors")for result.Next(&v) {    zscore.a = 1    zscore.b = 2    zscore.c = 0    //does not work    if err := visitors.UpdateId(v.Id, bson.M{"$set": zscore}); err != nil    {            log.Printf("Got error while updating visitor: %v\n", err)    }    //works    set := bson.M{        "zscore.a": zscore.a,        "zscore.b": zscore.b,        "zscore.c": zscore.c,    }    if err := visitors.UpdateId(v.Id, bson.M{"$set": set}); err != nil {        log.Printf("Got error while updating visitor: %v\n", err)    }}
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我知道的所有 Go 封送处理包,包括bson包,都不会封送私有字段(以小写字母开头)。要解决此问题,只需通过大写名称的第一个字母来导出相关字段。

另请注意,除了上述问题外,示例的第一部分不会以与第二部分等效的方式进行编组。bson.M{"$set": zscore}相当于bson.M{"$set": bson.M{"a": ... etc ...}}


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信