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

我正在尝试使用 ObjectId 进行查询,通常在 mongodb 中你会做这样的事情


db.collection.findOne({"_id":objectid("5d9d90e5ed645489aae6df64")})

当我执行正常查询时,这会起作用,但在 go lang 中,它给出的值是


ObjectIdHex("5d9d90e5ed645489aae6df64")

相反,这不会导致有效的查询。


我已经多次阅读 mgo 文档并尝试使用


bson.ObjectId("5d9d90e5ed645489aae6df64")

但它仍然使它成为我不明白的十六进制。我尝试了几种不同的组合,但它们几乎只是在黑暗中拍摄。


Go 语言处理程序


package userhandlers


import (

    "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)

}


慕少森
浏览 114回答 1
1回答

子衿沉夜

请注意,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,    // ...}
打开App,查看更多内容
随时随地看视频慕课网APP