これを処理する方法は複数あります。
マップの使用:
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"`
}