我很新。从我在mGo的示例中所看到的,要查询一个集合然后从中读取,您必须预先定义将要返回到结构中的数据。
type Person struct { ID bson.ObjectId `bson:"_id,omitempty"` Name string Phone string Timestamp time.Time }
在PHP中,文档被分配给一个数组。这很完美,因为一条记录可能具有完全不同的键集(可能不包含名称或电话,但包含电子邮件),而且我可以直接访问它而无需设置预定义的类/结构/变量。
在Go / mGo中有没有办法做到这一点?
您可以通过多种方式来处理此问题。
使用地图:
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一起使用,即使它们具有不同的值类型也是如此。
map[string]interface{}
使用文档切片:
的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) }
使用内嵌地图字段
该,inlineBSON 标志也可以在地图领域中使用,这样就可以有你的蛋糕和熊掌兼得。换句话说,它可以使用结构,从而方便处理已知字段,同时允许通过内联映射处理未知字段。
,inline
type Person struct { ID bson.ObjectId `bson:"_id,omitempty"` Name string Phone string Extra bson.M `bson:",inline"` }