将HTTP请求中的剩余JSON对象保存到MongoDB中。

huangapple go评论81阅读模式
英文:

Save remaining Json object from http - Body in MongoDB

问题

一个Go方法应该将任何JSON对象保存在MongoDB中。在代码中,只保存了ID而不是整个对象。如何修复这个问题?

import (
    "context"
    "encoding/json"
    "go.mongodb.org/mongo-driver/bson"
    "net/http"
)

// 将值插入到MongoDB中,无需解析
func InsertObjectToDatabase(response http.ResponseWriter, request *http.Request) {
    // 调用数据库和集合
    currentDatabase := clients.MongoClientForThisMicroservice.Database("APP_MONGO_DB")
    currentCollection := currentDatabase.Collection("APP_MONGO_DB")

    // 将结构化数据转换为bson
    var data interface{}
    err := json.NewDecoder(request.Body).Decode(&data)
    if err != nil {
        ErrorResponse(response, err)
        return
    }
    bsonBytes, err := bson.Marshal(data)
    if err != nil {
        ErrorResponse(response, err)
        return
    }

    // 写入数据库
    _, err = currentCollection.InsertOne(context.TODO(), bsonBytes)
    if err != nil {
        ErrorResponse(response, err)
        return
    }

    return
}

在MongoDB中的结果:

{
    "_id": {
        "$oid": "611b754fd413ee180f0a3d0a"
    }
}

请注意,我已经对代码进行了一些修改,以便正确地将整个对象保存到MongoDB中。我添加了一个data变量来解码请求体中的JSON数据,并将其转换为bson。然后,我使用data变量的值来插入数据库。

英文:

A Go method is supposed to save any JSON object in a MongoDB. In the code, only the ID and not the entire object is saved. How to fix that?

import (
    "context"
    "encoding/json"
    "go.mongodb.org/mongo-driver/bson"
    "net/http"
)


//insert the value to mongoDB without any parsing
func InsertObjectToDatabase(response http.ResponseWriter, request *http.Request) {
    //call database and collection
    currentDatabase := clients.MongoClientForThisMicroservice.Database("APP_MONGO_DB")
    currentCollection := currentDatabase.Collection("APP_MONGO_DB")

	//convert structured data to bson
	bsonBytes, errBsonConvert := bson.Marshal(json.NewDecoder(request.Body))
	if errBsonConvert != nil {
		ErrorResponse(response, errBsonConvert)
		return
	}

	//write values to database
	_, errInsertDatabase := currentCollection.InsertOne(context.TODO(), bsonBytes)
	if errInsertDatabase != nil {
		ErrorResponse(response, errInsertDatabase)
		return
	}

	return
}

Result in MongoDB

{
"_id": {
    "$oid": "611b754fd413ee180f0a3d0a"
}

答案1

得分: 1

你需要传递一个 Go 值,而不是 bson.Marshal() 的版本。

例如:

var model Model
if err := json.NewDecoder(response.Body).Decode(model); err != nil {
		// 处理错误
}
_, _ = currentCollection.InsertOne(context.TODO(), model)
英文:

You need to pass a Go value, not a bson.Marshal() version.

E.g.:

var model Model
if err := json.NewDecoder(response.Body).Decode(model); err != nil {
		// handle m
}
_, _ = currentCollection.InsertOne(context.TODO(), model)

huangapple
  • 本文由 发表于 2021年8月17日 16:45:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/68814305.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定