gpt4 book ai didi

json - Mongo-go-driver 从插入结果中获取 objectID

转载 作者:IT老高 更新时间:2023-10-28 13:33:02 27 4
gpt4 key购买 nike

使用 InsertOne 创建一个新文档后,当我返回结果时,我得到的是一个数字数组,而不是 ObjectID。在数据库中,id 生成良好。

type User struct {
ID string
Email string
Username string
Password string
}

var db = ...

// UserStore creates user
func UserStore(c echo.Context) (err error) {

coll := db.Collection("users")

u := new(User)
if err = c.Bind(u); err != nil {
return c.JSON(http.StatusInternalServerError, err)
}

result, err := coll.InsertOne(
context.Background(),
bson.NewDocument(
bson.EC.String("email", u.Email),
bson.EC.String("username", u.Username),
bson.EC.String("password", u.Password),
),
)
if err != nil {
return c.JSON(http.StatusInternalServerError, err)
}

return c.JSON(http.StatusCreated, result)
}

这会返回类似于 InsertedID: [90, 217, 85, 109, 184, 249, 162, 204, 249, 103, 214, 121] 的东西,而不是普通的 ObjectID。如何从新插入的文档中返回实际的 ObjectID

最佳答案

一个成功的Collection.InsertOne()将返回 mongo.InsertOneResult 类型的结果,这是一个包装新插入文档的 ID 的结构体:

type InsertOneResult struct {
// The identifier that was inserted.
InsertedID interface{}
}

官方的 MongoDB Go 驱动使用 primitive.ObjectID类型来表示 MongoDB ObjectIds。这种类型是一个简单的字节数组:

type ObjectID [12]byte

要访问此类型,您需要导入 primitive package .

import "go.mongodb.org/mongo-driver/bson/primitive"

InsertOneResult.InsertedID 将保存 primitive.ObjectID 的动态类型。 primitive.ObjectID 类型没有定义自定义的 JSON 编码(marshal)方法(未实现 json.Marshaler ),这意味着当结果转换为 JSON 时,将使用默认的编码(marshal)规则,这对于字节数组(不是 slice )就是你看到的:ObjectID 字节的十进制表示。

您不应将 InsertOneResult 类型的值转换为 JSON,因为它(或者更确切地说是 primitive.ObjectID 本身)不是“JSON 友好的”(至少不是在当前版本中)。

改为创建/包装您自己的类型,您可以在其中定义您希望结果在 JSON 中的样子,例如:

if oid, ok := result.InsertedID.(primitive.ObjectID); ok {
return c.JSON(http.StatusCreated, map[string]interface{}{
"id": oid.String(),
})
} else {
// Not objectid.ObjectID, do what you want
}

上面的代码会产生这样的 JSON 响应:

{"id":"ObjectID(\"5ad9a913478c26d220afb681\")"}

或者如果您只想要十六进制表示:

if oid, ok := result.InsertedID.(primitive.ObjectID); ok {
return c.JSON(http.StatusCreated, map[string]interface{}{
"id": oid.Hex(),
})
}

应该是:

{"id":"5ad9a913478c26d220afb681"}

关于json - Mongo-go-driver 从插入结果中获取 objectID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49933249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com