有多种方法可以处理这个问题。
使用地图:
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)
}
使用内联地图字段
,inline
bson标志也可以用在地图字段中,这样你就可以吃蛋糕了。换句话说,它允许使用结构,以便于操作已知字段,同时允许通过内联映射处理未知字段。
例如:
type Person struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string
Phone string
Extra bson.M `bson:",inline"`
}