我有一个相当奇怪的问题,我一直试图解决这个问题,并且正在寻找关于最佳方法的一些指示。我使用mgo来过滤包含几种不同类型的结构的集合,并且我试图在事实之后从bson.M转换为正确的结构。基本上我希望能够过滤集合并查看每个结果,并基于对正确结构投射的公共字段。
以下是我尝试使用的结构示例。
type Action interface {
MyFunc() bool
}
type Struct1 struct {
Id bson.ObjectId `bson:"_id,omitempty"`
Type string `bson:"type"`
Struct1Only string `bson:"struct1only"`
}
func (s Struct1) MyFunc() bool {
return true
}
type Struct2 struct {
Id bson.ObjectId `bson:"_id,omitempty"`
Type string `bson:"type"`
Struct2Only string `bson:"struct2only"`
}
func (s Struct2) MyFunc() bool {
return true
}
我最初的想法是做一些事情:
var result bson.M{}
err := c.Find(bson.M{nil}).One(&result)
然后打开类型字段并转换为正确的结构,但老实说,我是新手去mongo并确信有更好的方法来执行此操作。有什么建议?感谢
答案 0 :(得分:7)
您不必将bson.M转换为struct,而是直接将struct指针传递给One函数
var struct2 Struct2
err := c.Find(bson.M{nil}).One(&struct2)
如果您仍想将bson.M转换为struct,请使用Marshal和Unmarshal
var m bson.M
var s Struct1
// convert m to s
bsonBytes, _ := bson.Marshal(m)
bson.Unmarshal(bsonBytes, &s)