为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Smart猫小萌 2023-06-01 16:26:26
我不想在将结果转换为 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.Merr = 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 文档。
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

此代码有效。经过几个小时的尝试,感谢好运,我设法解决了这个问题。也许有人会解释这个?


而不是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


查看完整回答
反对 回复 2023-06-01
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

你也可以使用这个:


var results []bson.M

if 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)


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信