我如何将BSON文档转换为map [string] interface {}

I was trying to decode the data of the cursor into a map[string]interface{}, I tried it directly but it doesn't works at all, so I fount that I have to convert it to a BSON document and next convert it to a map[string]interface{}, and finally into a JSON string. I tried the following code:

...
for cursor.Next(context.Background()) {
    err = cursor.Decode(&itemBson)
    ...
    b, err := bson.Marshal(itemBson)
    ...
    err = bson.Unmarshal(b, &itemMap)
    ...
}
...

But the bson document has the following value:

map[_id:ObjectID("5c2d0809a49bad7d547ec028") applications:bson.Array[bson.Document{bson.Element{"enabled": true}}] userName:coto userUUID:df2d ea92-c189-53b3-aafe-485d0be23bee]

And the map parsed as JSON:

{"_id":"5c2d0809a49bad7d547ec028","applications":[{}],"userName":"coto","userUUID":"df2dea92-c189-53b3-aafe-485d0be23bee"}

As you can see the key "applications" is empty in the JSON, but it really has content in the BSON document. I don't know why the data disappear.

How I can solve this error? Thanks.

dptdb84606
dptdb84606 您找到了更好的方法吗?我认为bson编解码器有解决方案。
一年多之前 回复
douwei1944
douwei1944 你能提供一个可行的例子吗?
一年多之前 回复
dongtigai3875
dongtigai3875 显示itemBson的类型定义。您应该能够直接解码为map[string]interface{}。当您这样做时会发生什么?是否有错误或值不是您期望的值。
一年多之前 回复

2个回答

Solved:

I solved this error using the following code:

var jsonDocuments []map[string]interface{}
var byteDocuments []byte

var bsonDocument bson.D
var jsonDocument map[string]interface{}
var temporaryBytes []byte

for cursor.Next(context.Background()) {
    err = cursor.Decode(&bsonDocument)

    if err != nil {
        report.Report{Error: err, Trace: report.Trace()}.Send()
        requestContext.StatusCode(500)
        return `500 Internal server error`
    }

    temporaryBytes, err = bson.MarshalExtJSON(bsonDocument, true, true)

    if err != nil {
        report.Report{Error: err, Trace: report.Trace()}.Send()
        requestContext.StatusCode(500)
        return `500 Internal server error`
    }

    err = json.Unmarshal(temporaryBytes, &jsonDocument)

    if err != nil {
        report.Report{Error: err, Trace: report.Trace()}.Send()
        requestContext.StatusCode(500)
        return `500 Internal server error`
    }

    jsonDocuments = append(jsonDocuments, jsonDocument)
}
doulin6448
doulin6448 是的,下次我将在问题中添加更多详细信息。 对不起这是我的错。 无论如何,谢谢您的帮助!
一年多之前 回复
dsfjk44656
dsfjk44656 如图,看到您今天早些时候使用了MarshalExtJSON。 从您的原始帖子中我无法分辨出没有详细信息。 我的答案是基于Beta版本的。 Beta更像mgo。
一年多之前 回复
doutou7740
doutou7740 v0.0.19-prerelease @simagix
一年多之前 回复
dongshanxun6479
dongshanxun6479 您使用了哪个版本的mongo-go-driver?
一年多之前 回复

The bson.M from the official mongo-go-driver is pimitive.M which is the type of map[string]interface{}. Without seeing your declared variables, it's hard to tell what went wrong. Here is a working example using the official mongo-go-driver.

func TestUnmarshal(t *testing.T) {
    uri := "mongodb://localhost/stackoverflow?replicaSet=replset"
    ctx := context.Background()
    client, err := mongo.Connect(ctx, uri)
    if err != nil {
        t.Fatal(err)
    }
    c := client.Database("stackoverflow").Collection("acoll")
    list := []bson.M{bson.M{"enabled": true}}
    id := primitive.NewObjectID()
    c.InsertOne(ctx, bson.M{"_id": id, "applications": list, "userName": "my name"})
    var itemBson bson.M
    var itemMap map[string]interface{}
    cur, _ := c.Find(ctx, bson.M{})
    for cur.Next(ctx) {
        cur.Decode(&itemBson)
        t.Log(itemBson)
        b, _ := bson.Marshal(itemBson)
        bson.Unmarshal(b, &itemMap)
        t.Log(itemMap)
    }
}

output of go test

    unmarshal_test.go:28: map[_id:ObjectID("5c380ae501d48897a1ac27c6") applications:[map[enabled:true]] userName:my name]
    unmarshal_test.go:31: map[userName:my name _id:ObjectID("5c380ae501d48897a1ac27c6") applications:[map[enabled:true]]]
dowjgrm6787
dowjgrm6787 阅读源代码。 类型M map [string] interface {}; 这是来自github.com/mongodb/mongo-go-driver/blob/master/bson/primitive/…。 显示您的验证码,我可以为您纠正。
一年多之前 回复
dongyingming8970
dongyingming8970 这是:官方mongo-go-driver的bson.M是pimitive.M,它是map [string] interface {}的类型。 似乎不正确。 我无法在return参数中使用returnBson(类型[] primitive.M)作为类型map [string] interface {}
一年多之前 回复
du248227
du248227 您使用哪个版本的mongo-go-driver? 我从较早版本中看到了以前的行为。 我使用master的当前版本对其进行了测试,并且可以正常工作。
一年多之前 回复
dongzi5062
dongzi5062 谢谢,但是它不能解决我的错误,当复杂的结构(如数组或对象)转换为map [string] interface {}时,就会出现我的错误。 例如:(为实际示例,我将用JSON表示){“ test”:{“ a key”:“ a string value”}} mongo转换为以下{“ test”:[{“ Key” :“键”,“值”:{}}]}。 是否有任何选项可以直接从数据库返回JSON?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐