Mgo和golang问题。
我再遇到问题。我尝试更新数据库中的记录,但运行简单的命令visitors.UpdateId(v.Id, bson.M{"$set": zscore});
,其中zscore
是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)
}
}
答案 0 :(得分:1)
我所知道的所有Go封送包,包括bson包,都不会封送私有字段(以小写字母开头)。要解决此问题,只需通过大写其姓名的第一个字母来导出相关字段。
另请注意,除了上面提到的问题之外,示例的第一部分不会以与第二部分等效的方式编组。 bson.M{"$set": zscore}
相当于bson.M{"$set": bson.M{"a": ... etc ...}}
。