有多种方法可以处理这个问题.
Using a map:个
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{}
类型,你可以定义你自己的 map 类型,并与mgo一起使用,即使它们有不同的值类型.
Using a document slice:个
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)
}
Using an ,inline map field个
,inline
BSON flag也可以在 map 领域使用,这样你就可以兼得你的蛋糕和吃的了.换句话说,它支持使用 struct ,以便方便地操作已知字段,同时允许通过内联映射处理未知字段.
例如:
type Person struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string
Phone string
Extra bson.M `bson:",inline"`
}