使用 mongo-go-driver 将结果转换为不带结构的 JSON

我不想在将结果转换为 JSON 之前使用结构。假设我有一些结果:


result, err := collection.Find(ctx, filter, options)

我可以在docs变量中收集所有结果,并在doc变量中收集最后的结果:


    var doc bson.Raw

    var docs []bson.Raw    

    for result.Next(ctx) {

            document, err := result.DecodeBytes()

            if err != nil {

                log.Println(err)

            }

            doc = document

            docs = append(docs, doc)

        }

我可以在不使用任何结构的情况下轻松地将最后的结果转换为 JSON:


var jsonDoc bson.M

err = bson.Unmarshal(doc, &jsonDoc)

return jsonDoc

我无法将文档转换为 JSON 并因此在我的 Rest 服务器中使用。


2019-01-17 更新:


我在我的 REST 服务器中使用这样的结果:


user.GET("/booking/customer/:id", func(c *gin.Context) {

    result := GetAllCustomerBookings(c.Param("id"))

    c.JSON(http.StatusOK, result)

})

所以它不能通过值循环。问题:如何将 []bson.Raw 转换为 []byte 或 bson.Raw。让我们想象一下,现在我在数组的每个值中都有 {JSON}。我需要一个这样的 JSON:[{JSON}, {JSON}, ...]。


使用 nodejs 更容易,因为我可以在一个 JSON 文档中发送所有记录。Go 和 mongodb-go-driver 需要遍历所有记录,我不知道如何构建一个 JSON 文档。


Smart猫小萌
浏览 126回答 2
2回答

Qyouu

此代码有效。经过几个小时的尝试,感谢好运,我设法解决了这个问题。也许有人会解释这个?而不是bson.Raw我使用bson.M和result.Decode()而不是result.DecodeBytes() 现在我有与 nodejs 给我相同的输出。 var docs []bson.M    for result.Next(ctx) {        var document bson.M        err = result.Decode(&document)        if err != nil {            log.Println(err)        }        docs = append(docs, document)    }    return docs

qq_笑_17

你也可以使用这个:var results []bson.Mif err := cursor.All(context.TODO(), &results); err != nil {    log.Panic(err)}并查看结果或转换为 json 使用此:res, _ := json.Marshal(results)fmt.Println(string(res))如果你想自己做,你可以这样做:var convertedResult []map[string]interface{}for _, item := range results {    convertedItem := make(map[string]interface{})    for key, val := range item {        switch v := val.(type) {        case primitive.ObjectID:            convertedItem[key] = v.Hex()        case bson.M:            subMap := make(map[string]interface{})            for subKey, subVal := range v {                subMap[subKey] = subVal            }            convertedItem[key] = subMap        case bson.A:            subArray := make([]interface{}, len(v))            for i, subVal := range v {                subArray[i] = subVal            }            convertedItem[key] = subArray        default:            convertedItem[key] = v        }    }    convertedResult = append(convertedResult, convertedItem)}jsonBytes, err := json.Marshal(convertedResult)if err != nil {    panic(err)}jsonString := string(jsonBytes)fmt.Println(jsonString)
打开App,查看更多内容
随时随地看视频慕课网APP