bson.M到struct

时间:2016-04-01 17:33:59

标签: mongodb go

我有一个相当奇怪的问题,我一直试图解决这个问题,并且正在寻找关于最佳方法的一些指示。我使用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并确信有更好的方法来执行此操作。有什么建议?感谢

1 个答案:

答案 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)