有多种方式可以处理这个问题。
使用地图:
var m bson.M
err := collection.Find(nil).One(&m)
check(err)
for key, value := range m {
fmt.Println(key, value)
}
注意,有没有什么特别的是关于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 flag也可以在地图领域中使用,这样就可以有你的蛋糕和熊掌兼得。换句话说,它可以使用一个结构,以便操纵已知字段很方便,同时允许通过内联映射处理未知字段。
例如:
type Person struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string
Phone string
Extra bson.M `bson:",inline"`
}
嗨古斯塔沃,谢谢你的详细解答。我不知道处理可选属性的“内联”技巧。 mgo真的是一款非常棒的软件! – tux21b
是否可以在Find(nil).All(&m)上执行? –