首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo-go-driver从插入结果中获取objectID

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

Stack Overflow用户
提问于 2018-04-20 11:00:33
回答 1查看 15.6K关注 0票数 15

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-20 16:48:56

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

代码语言:javascript
复制
type InsertOneResult struct {
    // The identifier that was inserted.
    InsertedID interface{}
}

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

代码语言:javascript
复制
type ObjectID [12]byte

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

代码语言:javascript
复制
import "go.mongodb.org/mongo-driver/bson/primitive"

InsertOneResult.InsertedID将包含动态类型的primitive.ObjectIDprimitive.ObjectID类型没有定义自定义的JSON编组方法(不实现json.Marshaler),这意味着当结果转换为JSON时,将使用默认的编组规则,对于字节数组(而不是切片),这是您所看到的: ObjectID字节的十进制表示形式。

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

取而代之的是创建/包装您自己的类型,您可以在其中定义您希望结果在JSON中的外观,例如:

代码语言:javascript
复制
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响应:

代码语言:javascript
复制
{"id":"ObjectID(\"5ad9a913478c26d220afb681\")"}

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

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

这将是:

代码语言:javascript
复制
{"id":"5ad9a913478c26d220afb681"}
票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49933249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档