gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:30:21 25 4
gpt4 key购买 nike

我正在尝试使用 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)
}

Go 语言结构

package databasestructs

import (
//"go.mongodb.org/mongo-driver/bson/primitive"
"labix.org/v2/mgo/bson"
)

type Find struct {
ID bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"`
MongoCollection string `json:"mongoCollection,omitempty" bson:"mongoCollection,omitempty"`
Criteria string `json:"criteria,omitempty" bson:"criteria,omitempty"`
CriteriaValue string `json:"criteriaValue,omitempty" bson:"criteriaValue,omitempty"`
FindAll bool `json:"findAll,omitempty" bson:"findAll,omitempty"`
}

Go 语言函数

package databaseservice

import (
"context"
"log"

//Structs
userstructs "malikiah.io/structs/userStructs"
databasestructs "malikiah.io/structs/databaseStructs"

//"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"gopkg.in/mgo.v2/bson"

)

func Find(databaseQuery databasestructs.Find) (result string) {
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)

// Database name
db := client.Database("malikiah")
collection := db.Collection(databaseQuery.MongoCollection)

if err != nil {
log.Fatal(err)
}

if databaseQuery.Criteria == "_id" {
log.Println(databaseQuery.ID)
result := collection.FindOne(context.TODO(), bson.M{databaseQuery.Criteria: databaseQuery.ID}).Decode(&result)
log.Println(result)
} else if databaseQuery.Criteria == "" {

} else if databaseQuery.FindAll == true {

} else {

}
return
}

最佳答案

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

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")) 只不过是一种类型 conversion 。您将十六进制对象 ID 字符串转换为 bson.ObjectId,但这不是您想要的。您想要解析十六进制对象ID。为此,请使用 bson.ObjectIdHex() 功能:

databaseQuery := databasestructs.Find{
ID: bson.ObjectIdHex(request.FormValue("_id")),
MongoCollection: "users",
Criteria: "_id",
CriteriaValue: "",
FindAll: false,
}

请注意,如果传递的字符串是无效的十六进制对象 ID,bson.ObjectIdHex() 将会出现困惑。使用bson.IsObjectIdHex()在调用 bson.ObjectId() 之前检查它。详情见Prevent runtime panic in bson.ObjectIdHex .

如果您想使用官方驱动程序而不是 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,
// ...
}

关于mongodb - mgo 正在将 objectid 设置为 objectidhex,Mongodb 似乎无法读取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301536/

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