去mgo不存储对象

时间:2013-08-30 13:04:06

标签: mongodb go mgo

使用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 个答案:

答案 0 :(得分:13)

type Person struct {
    name string
    age  int
}

mgo包无法访问结构的未导出(小写)字段(即除了定义结构的包之外没有其他包)。你需要导出它们(首字母必须是大写字母),如下所示:

type Person struct {
    Name string 
    Age  int    
}

如果您希望在DB中使用小写字母名称,则必须为它们提供结构标记,如下所示:

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

请参阅documentation on names

  

Go中的名称与任何其他语言一样重要。他们甚至有   语义效果:包外的名称的可见性   由第一个字符是否为大写字母决定。 [...]

修改

Gustavo Niemeyer(mgobson软件包的作者)在评论中指出,与json软件包不同,bson marshaller将小写所有struct字段名称提交到数据库,有效地使这个答案的最后一步变得多余。