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});
其中 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)
}
}
我所知道的所有 Go 编组包,包括 bson 包,都不会编组私有字段(以小写字母开头)。要解决此问题,只需将相关字段的名称首字母大写即可导出。
另请注意,除了上述问题外,示例的第一部分不会以与第二部分等效的方式编组。 bson.M{"$set": zscore}
等同于 bson.M{"$set": bson.M{"a": ... etc ...}}
.
Mgo 和 golang 问题。
我运行又出问题了。我尝试更新数据库中的记录,但是 运行ning 简单命令 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)
}
}
我所知道的所有 Go 编组包,包括 bson 包,都不会编组私有字段(以小写字母开头)。要解决此问题,只需将相关字段的名称首字母大写即可导出。
另请注意,除了上述问题外,示例的第一部分不会以与第二部分等效的方式编组。 bson.M{"$set": zscore}
等同于 bson.M{"$set": bson.M{"a": ... etc ...}}
.