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、MongoDB 2.4.6 で go 1.1.2 を使用しています。

4

1 に答える 1

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"`
}

名前に関するドキュメントを参照してください。

Go では、他の言語と同様に名前が重要です。それらには意味的な効果さえあります。パッケージ外の名前の可視性は、最初の文字が大文字かどうかによって決まります。[...]

編集

Gustavo Niemeyer (mgoおよびbsonパッケージの作成者) はコメントで、jsonパッケージとは異なり、bsonマーシャラーはデータベースにコミットするときにすべての構造体フィールド名を小文字にするため、この回答の最後のステップが不要になると述べています。

于 2013-08-30T13:17:11.930 に答える