【问题标题】:How to unmarshal bson document as type M with mongo-go-driver如何使用 mongo-go-driver 将 bson 文档解组为 M 类型
【发布时间】:2020-09-26 01:51:58
【问题描述】:

根据 mongo-driver https://godoc.org/go.mongodb.org/mongo-driver/bson 中的文档 将 bson 解组为 interface{} 会将值默认为 D

  1. 解组时,interface{} 类型的字段将遵循上面列出的 D/M 类型映射。 BSON 文件 解组到 interface{} 字段将被解组为 D。

如果我将一个对象存储在 db 中:

"data": {
   "property1": "value1",
   "property2": "value2",
}

当我用“”检索此数据时

var result interface{}
err = collection.FindOne(ctx, filter).Decode(&result)

变成:

"data": [
   {"Key": "property1", "Value": "value1"},
   {"Key": "property2", "Value": "value2"}
]

与文档相匹配,类型 D 是一段键值

我的问题是,有没有办法改变这种行为,以便将数据解组到 M 中?

我的应用不知道数据的实际结构。它只是将 json 作为输入并存储在 db 中,因此我必须在 unmarhsal 时使用 interface{} 作为类型。如果它作为地图存储在数据库中,它应该以相同的方式检索数据。

【问题讨论】:

    标签: mongodb go


    【解决方案1】:

    如果您传递 interface{} 然后将其解组为无法更改的 bson.D,这是默认功能。但是您可以通过这种方式将bson.D 转换为bson.M

    resultMap := result.(bson.D).Map()
    

    或者解组时直接使用bson.M这个变量。

    var result bson.M
    err = collection.FindOne(ctx, filter).Decode(&result)
    

    【讨论】:

      【解决方案2】:

      解组到bson.M类型的变量:

      var result bson.M
      err = collection.FindOne(ctx, filter).Decode(&result)
      

      因为bson.M 类型满足interface{} 接口(与所有类型一样),所以您可以在使用interface{} 值的任何地方使用bson.M 值。

      Run it on the playground.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-05
        • 2019-04-06
        • 2019-09-16
        • 2020-12-16
        • 2019-03-12
        • 2019-05-21
        相关资源
        最近更新 更多