【问题标题】:Primitive.ObjectID to string in GolangPrimitive.ObjectID 到 Golang 中的字符串
【发布时间】:2020-07-06 22:41:00
【问题描述】:

我正在尝试在 Go 中将类型 primitive.ObjectID 转换为 string 类型。我正在使用来自go.mongodb.org/mongo-drivermongo-driver

我尝试使用类型断言,如

mongoId := mongoDoc["_id"];
stringObjectID := mongoId.(string)

哪个 VSCode 接受。代码被编译,当它到达这个特定的代码行时,它会抛出这个错误

panic: interface conversion: interface {} is primitive.ObjectID, not string

【问题讨论】:

  • 如果你不告诉我们primitive.ObjectID是如何定义的,你不可能告诉你如何将primitive.ObjectID转换成字符串。
  • 嗨 Flimzy,它的定义如下 var parentOrder bson.M;并附加到切片数组中,切片数组的定义如下 var mapArray []bson.M 函数循环遍历此切片数组以扫描 _id ,就像我上面解释的那样。 mongoDoc 是一个 bson.M 类型的单个 mongo 文档
  • 请用该信息更新问题。

标签: string mongodb go objectid mongo-go


【解决方案1】:

错误消息告诉mongoDoc["_id"]interface{} 类型,它包含primitive.ObjectID 类型的值。这不是string,它是一个独特的类型。您只能从接口值中键入 assert primitive.ObjectID

如果你想要这个 MongoDB ObjectId 的 string 表示,你可以使用它的 ObjectID.Hex() 方法来获取 ObjectId 字节的十六进制表示:

mongoId := mongoDoc["_id"]
stringObjectID := mongoId.(primitive.ObjectID).Hex()

【讨论】:

  • 非常感谢。你救了我的命。它像魔术一样工作。再次感谢
  • 如何将字符串转换为对象ID?
  • 现在你可以只做 mongoId.Hex()
  • @bashizip 是的,答案就是这样。如果你有一个ObjectID,你可以调用它的Hex() 方法。如果您将文档放在具有 interface{} 值类型的映射中,则需要类型断言。
  • @icza 谢谢你的精确,我还是 golang 的新手,我只是从你那里学到一些东西
【解决方案2】:
var stringObjectId string = mongoId.(primitive.ObjectID).String()

【讨论】:

    【解决方案3】:

    2021 年情况发生了变化。这里有一个更简单的方法。它让用户从模型中询问它是哪种类型的界面然后一切都很好

    var user models.User
    
    query := bson.M{"$or": []bson.M{{"username": data["username"]}, {"email": data["username"]}}}
    
    todoCollection := config.MI.DB.Collection(os.Getenv("DATABASE_COLLECTION_USER"))
    todoCollection.FindOne(c.Context(), query).Decode(&user)
    
    stringObjectID := user.ObjectID.Hex()
    

    以上代码适用于这个接口:

    type User struct {
        ObjectID primitive.ObjectID `bson:"_id" json:"_id"`
    
        // Id        string    `json:"id" bson:"id"`
        Username      string    `json:"username" gorm:"unique" bson:"username,omitempty"`
        Email         string    `json:"email" gorm:"unique" bson:"email,omitempty"`
        Password      []byte    `json:"password" bson:"password"`
        CreatedAt     time.Time `json:"createdat" bson:"createat"`
        DeactivatedAt time.Time `json:"updatedat" bson:"updatedat"`
    }
    

    因此:这 3 行代码会做得很好:

    objectidhere := primitive.NewObjectID()
    stringObjectID := objectidhere.Hex()
    
    filename_last := filename_rep + "_" + stringObjectID + "." + fileExt
    

    【讨论】:

      【解决方案4】:

      现在你可以只做 mongoId.Hex()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 2019-01-14
        • 2017-10-23
        • 2019-03-12
        • 2021-06-15
        相关资源
        最近更新 更多