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。

4

1 回答 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(mgoandbson包的作者)在评论中指出,与json包不同,bson编组器在提交到数据库时会将所有结构字段名称小写,从而有效地使此答案中的最后一步变得多余。

于 2013-08-30T13:17:11.930 回答