Go的mgo没有存储对象

3

使用mgo时,我无法存储任何有意义的数据。只有_id被存储。

type Person struct {
    name string
    age int
}

func main() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        log.Fatal(err)
    }
    defer session.Close()

    p := Person{"Joe", 50}
    ppl := session.DB("rest").C("people")
    ppl.Insert(p)
}

在Mongo中,结果只有_id字段 - 没有"Joe"的迹象。
在Arch Linux上使用go 1.1.2和MongoDB 2.4.6。
1个回答

13
type Person struct {
    name string
    age  int
}

mgo包无法访问结构体中未导出的(小写)字段(即只能在定义该结构体的包中访问)。您需要将它们导出(首字母必须大写),例如:

type Person struct {
    Name string 
    Age  int    
}

如果您希望在数据库中将字段名称转换为小写,您必须为它们提供结构标记,如下所示:

type Person struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
}

请参阅名称文档

在Go语言中,名称与其他语言一样重要。它们甚至具有语义效应:名称在包外的可见性取决于其首字母是否大写。[...]

编辑:

Gustavo Niemeyer(mgobson软件包的作者)在评论中指出,与json软件包不同的是,bson编组器将在提交到数据库时将所有结构字段名称转换为小写,从而有效地使本答案中的最后一步变得多余。


2
Emil,这个在文档(http://labix.org/v2/mgo/bson#Marshal)中有说明,但这实际上是在 Go 中的全局约定。无论你使用哪个编组包,情况都是如此。 - Gustavo Niemeyer
2
Tom,请注意,与json包不同,bson包实际上默认使用小写字段名称,因为这是数据库端最常用的惯例。尽管如此,您的观点仍然是有效的,如果您想从此默认值更改,则需要标记。 - Gustavo Niemeyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接