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

Update query in MGO driver, works with bson.M, but does not work with custome structure

Mgo 和 golang 问题。

我运行又出问题了。我尝试更新数据库中的记录,但是 运行ning 简单命令 visitors.UpdateId(v.Id, bson.M{"$set": zscore}); 其中 zscoretype 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)
    }
}

我所知道的所有 Go 编组包,包括 bson 包,都不会编组私有字段(以小写字母开头)。要解决此问题,只需将相关字段的名称首字母大写即可导出。

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