【问题标题】:Go mgo not storing objectGo mgo不存储对象
【发布时间】:2013-09-03 05:24:25
【问题描述】:

使用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。

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:
    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"`
    }
    

    documentation on names

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

    编辑

    Gustavo Niemeyer(mgobson 包的作者)在 cmets 中指出,与 json 包不同,bson 编组器在提交到数据库时会将所有结构字段名称小写,从而有效地使这个答案的最后一步是多余的。

    【讨论】:

    • Emil,它在文档中 (labix.org/v2/mgo/bson#Marshal),但这实际上是 Go 中的一个全局约定。您使用的任何封送包都会出现这种情况。
    • Tom,请注意,与 json 包不同,bson 包实际上默认使用小写的字段名称,因为这是数据库端最常用的约定。但是,您的观点仍然有效,如果要更改此默认值,则需要该标记。
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 2015-09-11
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2014-01-17
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多