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

5

我试图将光标的数据解码为map[string]interface{},但是直接尝试并没有起作用,所以我发现我必须将其转换为BSON文档,然后再转换为map[string]interface{},最后转换为JSON字符串。我尝试了以下代码:

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

但是bson文档具有以下值:
map[_id:ObjectID("5c2d0809a49bad7d547ec028") applications:bson.Array[bson.Document{bson.Element{"enabled": true}}] userName:coto userUUID:df2dea92-c189-53b3-aafe-485d0be23bee]
而转换为JSON的map如下:
{"_id":"5c2d0809a49bad7d547ec028","applications":[{}],"userName":"coto","userUUID":"df2dea92-c189-53b3-aafe-485d0be23bee"}
如您所见,JSON中的“applications”键为空,但在BSON文档中确实具有内容。我不知道数据为什么会消失。
我该如何解决这个错误?谢谢。

1
展示 itemBson 的类型定义。你应该能够直接解码成 map[string]interface{}。当你这样做时会发生什么?会出现错误吗,还是值不如你所期望的那样。 - Charlie Tumahai
@Marco,你能提供一个可行的例子吗? - celicoo
@Marco,你有没有找到更好的方法?我认为使用bsoncodec.Registery可以解决这个问题。 - Parham Alvani
2个回答

11

解决:

我使用以下代码解决了这个错误:

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)

    ...

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

    ...

    err = json.Unmarshal(temporaryBytes, &jsonDocument)

    ...

    jsonDocuments = append(jsonDocuments, jsonDocument)
}

你使用的mongo-go-driver版本是哪个? - simagix
v0.0.19预发布版 @simagix - Marco
看到你今天早些时候使用了 MarshalExtJSON。 从你最初的帖子中无法确定细节。我的答案是基于beta版本的。Beta版本更类似于mgo。 - simagix
@simagix,下次我会在我的问题中添加更多细节。抱歉,我的错。无论如何,感谢您的帮助! - Marco
1
这似乎是一项繁重的操作。 - Amin Shojaei

5
temp := itemBson.data.(primitive.D) // convert interface to primitive D

metadata := temp.Map() // map to map[string]interface{}

if v, ok := metadata[prqKey]; ok { // check and use value
    commitID = v.(string)
}

你可以使用内置的接口将primitive.D类型转换为map[string]interface{}类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接