簡體   English   中英

Mongo-go-driver 中的解碼不正確

[英]Incorrect decoding in Mongo-go-driver

例如,我有這樣的結構:

type Overview struct {
    Symbol               string             `json:"Symbol,omitempty"`
    AssetType            string             `json:"AssetType,omitempty"`
    Name                 string             `json:"Name,omitempty"`
    Description          string             `json:"Description,omitempty"`
    ...
    ...
}

除此之外,我還有其他幾個結構。 我的函數為 Decode() 選擇了一個合適的結構,但是當我嘗試從數據庫中獲取數據時,我得到了這種形式的結果:

[
    {
        "Key": "_id",
        "Value": "618aa6f2a64cb8105a9c7984"
    },
    {
        "Key": "Symbol",
        "Value": "IBM"
    },
    {
        "Key": "FiscalYearEnd",
        "Value": "December"
    },
    ...
    ...
] 

我希望以我的結構形式得到響應,但我得到了這樣一個數組。 我嘗試自己聲明響應的結構: var result models.Overview 之后,問題消失了,但這不是我的問題的解決方案

有我的功能:

var (
    models map[string]interface{}
)

func init() {
    models = make(map[string]interface{})
    models["Overview"] = models.Overview{}
    models["Earnings"] = models.Earnings{}
    ...
    ...
}
func GetDbData(collection string, db *mongo.Database, filter bson.D) (interface{}, error) {
    var result = models[collection] // Choosing a structure
    res := db.Collection(collection).FindOne(context.TODO(), filter)
    err := res.Decode(&result)
    if err != nil {
        return nil, err
    }
    return result, nil
}

我不明白為什么會這樣,我希望有人已經遇到過這個問題並且能夠幫助我

https://jira.mongodb.org/browse/GODRIVER-988

Another approach to solve this can be by first decoding it into bson.M type and then unmarshalling it to your struct. Yes, this is not optimal.

eg:

func GetMonthStatusByID(ctx context.Context, id string) (interface{}, error) {
 var monthStatus interface{}
 filter := bson.M\{"_id": id}
 err := db.Collection("Months").FindOne(ctx, filter).Decode(&monthStatus)
 return monthStatus, err
}
The above snippet should be changed to:

func GetMonthStatusByID(ctx context.Context, id string) (interface{}, error) {
 var monthStatus interface{}
 filter := bson.M\{"_id": id}
tempResult := bson.M{}
 err := db.Collection("Months").FindOne(ctx, filter).Decode(&tempResult)
if err == nil {   
    obj, _ := json.Marshal(tempResult)
    err= json.Unmarshal(obj, &monthStatus)
}
 return monthStatus, err
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM