【问题标题】:bson.M to structbson.M 构造
【发布时间】:2016-07-21 14:55:39
【问题描述】:

我有一个相当奇怪的问题,我一直在试图解决这个问题,并正在寻找一些关于最佳方法的建议。我正在使用 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)

然后打开类型字段并转换为正确的结构,但老实说,我是新手,我相信有更好的方法来做到这一点。有什么建议?谢谢

【问题讨论】:

  • 您将两种不同的结构类型存储到一个集合中?我不知道有什么方法可以猜测正确的方法来转换结果,而无需显式地打开特定于任一结构的字段的存在。
  • 此外,如果这两个结构在一个领域不同,您可以并且可能应该将它们组合起来。一个不存在的字段只会计算为 nil。
  • 我已经简化了示例的结构,在我的项目中,它们之间大约有 10 个字段不同,它们实际上共享大约 15 个字段。我可以将结构组合起来,并且根据类型只有几个字段为零,我只是希望将结构分开,因为我认为这样会更干净。

标签: mongodb go


【解决方案1】:

您不必将 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2021-01-24
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多