为了账号安全,请及时绑定邮箱和手机立即绑定

mgo 正在将 objectid 设置为 objectidhex,Mongodb 似乎无法读取它

mgo 正在将 objectid 设置为 objectidhex,Mongodb 似乎无法读取它

Go
慕少森 2023-07-26 19:57:14
我正在尝试使用 ObjectId 进行查询,通常在 mongodb 中你会做这样的事情db.collection.findOne({"_id":objectid("5d9d90e5ed645489aae6df64")})当我执行正常查询时,这会起作用,但在 go lang 中,它给出的值是ObjectIdHex("5d9d90e5ed645489aae6df64")相反,这不会导致有效的查询。我已经多次阅读 mgo 文档并尝试使用bson.ObjectId("5d9d90e5ed645489aae6df64")但它仍然使它成为我不明白的十六进制。我尝试了几种不同的组合,但它们几乎只是在黑暗中拍摄。Go 语言处理程序package userhandlersimport (    "log"    "net/http"    //"fmt"    //"go.mongodb.org/mongo-driver/bson/primitive"    //"go.mongodb.org/mongo-driver/bson"    "labix.org/v2/mgo/bson"    //Services    databaseservice "malikiah.io/services/databaseService"    passwordservice "malikiah.io/services/passwordService"    //Structs    userstructs "malikiah.io/structs/userStructs"    databasestructs "malikiah.io/structs/databaseStructs")func LoginHandler(response http.ResponseWriter, request *http.Request) {    response.Header().Set("Content-Type", "application/json")    response.WriteHeader(http.StatusOK)    databaseQuery := databasestructs.Find{        ID: bson.ObjectId(request.FormValue("_id")),        MongoCollection: "users",        Criteria: "_id",        CriteriaValue: "",        FindAll: false,    }    log.Println(databaseQuery)    databaseservice.Login(databaseQuery)}
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

请注意,labix.org/v2/mgo不再维护,如果您想使用mgo,请github.com/globalsign/mgo改用。或者新的官方mongo-go 驱动程序。

bson.ObjectId是一种具有string以下基础类型的类型:

type ObjectId string

因此,当您像这样填充对象时:

databaseQuery := databasestructs.Find{

    ID: bson.ObjectId(request.FormValue("_id")),

    MongoCollection: "users",

    Criteria: "_id",

    CriteriaValue: "",

    FindAll: false,

}

bson.ObjectId(request.FormValue("_id"))只不过是类型转换。您将十六进制对象 ID 字符串转换为bson.ObjectId,但这不是想要的。您想要解析十六进制对象 ID。为此,请使用以下函数bson.ObjectIdHex()

databaseQuery := databasestructs.Find{

    ID: bson.ObjectIdHex(request.FormValue("_id")),

    MongoCollection: "users",

    Criteria: "_id",

    CriteriaValue: "",

    FindAll: false,

}

请注意,bson.ObjectIdHex()如果传递的字符串是无效的十六进制对象 ID,则会出现恐慌。用于bson.IsObjectIdHex()在调用之前进行检查bson.ObjectId()

如果您想使用官方驱动程序而不是mgo,您可以使用primitive.ObjectIDFromHex()函数来创建ObjectId,例如:

id, err := primitive.ObjectIDFromHex(request.FormValue("_id"))

if err != nil {

    // Handle error

    return

}

// If no error, you may use it:

databaseQuery := databasestructs.Find{

    ID: id,

    // ...

}


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信