20

私はGoが初めてです。mGo の例で見たことから、コレクションをクエリしてから読み取るには、構造体に返されるデータを事前に定義する必要があります。

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Timestamp time.Time
}

PHP では、ドキュメントは配列に割り当てられました。1 つのレコードが完全に異なるキーのセット (名前または電話を含まず、電子メールを含む場合があります) を持つ可能性があり、定義済みのクラス / 構造体 / 変数を設定せずに直接アクセスできるため、これは完璧でした。

Go / mGoで同じことを行う方法はありますか?

4

2 に答える 2

48

これを処理する方法は複数あります。

マップの使用:

var m bson.M
err := collection.Find(nil).One(&m)
check(err)
for key, value := range m {
    fmt.Println(key, value)
}

mgoに関する限り、bson.Mについて特別なことは何もないことに注意してください。これは単なるmap[string]interface{}タイプであり、値のタイプが異なる場合でも、独自のマップ タイプを定義して mgo で使用できます。

ドキュメント スライスの使用:

bson.Dは、 mgoが内部的に認識しているスライスであり、より効率的なメカニズムを提供するためと、キーの順序を維持する方法を提供するために存在します。これは、MongoDB によって特定の状況で使用されます (たとえば、インデックス)。

例えば:

var d bson.D
err := collection.Find(nil).One(&d)
check(err)
for i, elem := range d {
    fmt.Println(elem.Name, elem.Value)
}

インライン マップ フィールドの使用

bsonフラグ,inlineはマップ フィールドでも使用できるため、ケーキを持って食べることもできます。つまり、構造体を使用して既知のフィールドを便利に操作できるようにすると同時に、インライン マップを介して未知のフィールドを処理できるようにします。

例えば:

type Person struct {
    ID        bson.ObjectId `bson:"_id,omitempty"`
    Name      string
    Phone     string
    Extra     bson.M `bson:",inline"`
}
于 2013-08-20T23:07:36.427 に答える