我會盡量說清楚。我正在使用 MongoDB 和 Model-Vew-Controller 架構構建一個簡單的審計日志 API。作為功??能的一部分,用戶可以使用 http 端點請求資料。命中端點時,控制器包呼叫模型包,執行如下代碼:
// The GetResourceData function takes the resource, and provides the log data for that resource, sorted by // date and time. It also takes a context.context, and a *mongo.Client as parameters.
func GetResourceData(ctx context.Context, CL *mongo.Client, Resource string) error { ourDatabase := CL.Database("Event_Database") eventsCollection := ourDatabase.Collection("Events")
opts := options.Find()
opts.SetSort(bson.D{{"Date", -1}, {"Time", -1}})
filterCursor, err := eventsCollection.Find(
ctx,
bson.M{"Resource": Resource},
opts)
if err != nil {
log.Fatal(err)
}
defer filterCursor.Close(ctx)
for filterCursor.Next(ctx) {
var eventsFiltered []bson.D
if err = filterCursor.All(ctx, &eventsFiltered); err != nil {
log.Fatal(err)
}
fmt.Println(eventsFiltered)
}
return err
}
這很好用,如您所見,我已將 eventsFiltered 列印到終端。然而,它在那里并沒有多大用處,我需要將它列印到螢屏上。我有一個函式可以在視圖包中使用 http.ResponseWriter 執行此操作,但是 - 我無法弄清楚如何將 bson.D 轉換為字串格式,因此我可以干凈地將其作為引數傳遞。如果我嘗試 bson.Unmarshall;
var cookie []byte
bson.Unmarshal(cookie, eventsFiltered)
s := string(cookie)
fmt.Println("Events filtered as a string is: ", s)
fmt.Println("Events filtered as a byte slice is: ", cookie)
我得到以下資訊;
過濾為字串的用戶是:
過濾為位元組切片的用戶是:[]
...一個空字串,或一個空位元組切片。我知道我缺少一些非常簡單的東西,但我看不到它!
任何幫助將不勝感激。請詢問您是否有任何問題。
謝謝
uj5u.com熱心網友回復:
首先,如果您使用filterCursor.All(ctx, &eventsFiltered),則無需遍歷所有集合或關閉游標(游標方法All(...)將為您完成)。
你的問題呢,你可以做這樣的事情:
var eventsFiltered []bson.D
if err = filterCursor.All(ctx, &eventsFiltered); err != nil {
log.Fatal(err)
}
for _, event := range eventsFiltered {
for _, keyValPair := range event {
fmt.Printf("key is %s; val is %v", keyValPair.Key, keyValPair.Value)
}
}
或者,如果元素的順序無關緊要,請考慮解組為bson.M:
var eventsFiltered []bson.M
if err = filterCursor.All(ctx, &eventsFiltered); err != nil {
log.Fatal(err)
}
for _, event := range eventsFiltered {
for key, val := range event {
fmt.Printf("key is %s; val is %v", key, val)
}
}
因此,整個解決方案將是:
func GetResourceData(ctx context.Context, CL *mongo.Client, Resource string) error {
ourDatabase := CL.Database("Event_Database")
eventsCollection := ourDatabase.Collection("Events")
opts := options.Find()
opts.SetSort(bson.D{{"Date", -1}, {"Time", -1}})
filterCursor, err := eventsCollection.Find(
ctx,
bson.M{"Resource": Resource},
opts)
if err != nil {
log.Fatal(err)
}
if filterCursor.Next(ctx) {
var eventsFiltered []bson.M
if err = filterCursor.All(ctx, &eventsFiltered); err != nil {
log.Fatal(err)
}
// If you need ordered print, uncomment the following lines and comment out following uncommented for loop
// for _, event := range eventsFiltered {
// for _, keyValPair := range event{
// fmt.Printf("key is %s; val is %v", keyValPair.Key, keyValPair.Value)
// }
// }
for _, event := range eventsFiltered {
for key, val := range event {
fmt.Printf("key is %s; val is %v", key, val)
}
}
}
return nil
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/456258.html
