猿问

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

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)

    }

}


守着一只汪
浏览 302回答 1
1回答

胡说叔叔

我知道的所有 Go 封送处理包,包括bson包,都不会封送私有字段(以小写字母开头)。要解决此问题,只需通过大写名称的第一个字母来导出相关字段。另请注意,除了上述问题外,示例的第一部分不会以与第二部分等效的方式进行编组。bson.M{"$set": zscore}相当于bson.M{"$set": bson.M{"a": ... etc ...}}。
随时随地看视频慕课网APP

相关分类

Go
我要回答