英文:
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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论