无法从MongoDB获取完整文档

时间:2019-07-19 15:07:20

标签: mongodb go

我有一个mongodb集合,其中包含这种形式的项目

    {
    "_id" : "base_519",
    "Name" : "Name",
    "Position" : 1000,
    "Type" : "Base",
    "Visible" : true,
    "Preview" : "/preview/preview.jpg",
    "IsBase" : true,
    "Product" : "product-2",
    "Categories" : [ 
        "category_1"
    ],
    "ObjData" : [ 
        {
            "_t" : "ObjDataNormal",
            "CanBuy" : false,
            "Foreground" : "/fg/foreground.gif",
            "Background" : "null.no.gif",
            "HasRatio" : false,
            "Ratio" : "0",
            "HasPadding" : true,
            "Padding" : 40,
            "Mask" : {
                "_id" : 0,
                "Name" : "",
                "X" : 39,
                "Y" : 85,
                "Width" : 422,
                "Height" : 332
            }
        }
    ]
}

但是当我尝试获取整个集合时,没有返回ObjData字段,而是我得到了

{
        "id": "base_519",
        "name": "Name",
        "position": 1000,
        "type": "Base",
        "visible": true,
        "preview": "/preview/preview.jpg",
        "isbase": true,
        "product": "product-2",
        "categories": [
            "category_1"
        ]
    }

我是Go语言的新手,这只是我第一次尝试使用mongodb驱动程序之一。我在Go中使用的结构是这些

// Variant Struct
type Variant struct {
    ID         string        `json:"id,omitempty" bson:"_id,omitempty"`
    Name       string        `json:"name,omitempty" bson:"Name,omitempty"`
    Position   int           `json:"position,omitempty" bson:"Position,omitempty"`
    Type       string        `json:"type,omitempty" bson:"Type,omitempty"`
    Visible    bool          `json:"visible,omitempty" bson:"Visible,omitempty"`
    Preview    string        `json:"preview,omitempty" bson:"Preview,omitempty"`
    IsBase     bool          `json:"isbase,omitempty" bson:"IsBase,omitempty"`
    Product    string        `json:"product,omitempty" bson:"Product,omitempty"`
    Categories []string      `json:"categories,omitempty" bson:"Categories,omitempty"`
    ObjData    []ObjDataType `json:"objdata,omitempty" bson:"ObjData,omitempty"`
}

// ObjData Struct
type ObjDataType struct {
    Type       string   `json:"type,omitempty" bson:"_t,omitempty"`
    CanBuy     bool     `json:"canbuy,omitempty" bson:"CanBuy,omitempty"`
    Foreground string   `json:"foreground,omitempty" bson:"Foreground,omitempty"`
    Background string   `json:"background,omitempty" bson:"Background,omitempty"`
    HasRatio   bool     `json:"hasratio,omitempty" bson:"HasRatio,omitempty"`
    Ratio      float64  `json:"ratio,omitempty" bson:"Ratio,omitempty"`
    HasPadding bool     `json:"haspadding,omitempty" bson:"HasPadding,omitempty"`
    Padding    int      `json:"padding,omitempty" bson:"Padding,omitempty"`
    Mask       MaskType `json:"mask,omitempty" bson:"Mask,omitempty"`
}

// Mask Struct
type MaskType struct {
    ID     int    `json:"id,omitempty" bson:"_id,omitempty"`
    Name   string `json:"name,omitempty" bson:"Name,omitempty"`
    X      int    `json:"x,omitempty" bson:"X,omitempty"`
    Y      int    `json:"y,omitempty" bson:"Y,omitempty"`
    Width  int    `json:"width,omitempty" bson:"Width,omitempty"`
    Height int    `json:"height,omitempty" bson:"Height,omitempty"`
}

然后我尝试使用此功能来检索它们

func GetVariants(response http.ResponseWriter, request *http.Request) {
    response.Header().Add("content-type", "application/json")
    var variants []Variant
    collection := client.Database("FR-ToolService").Collection("Variants")
    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    cursor, err := collection.Find(ctx, bson.M{})
    if err != nil {
        response.WriteHeader(http.StatusInternalServerError)
        response.Write([]byte(`{ "message": "` + err.Error() + `"}`))
        return
    }
    defer cursor.Close(ctx)
    for cursor.Next(ctx) {
        var variant Variant
        cursor.Decode(&variant)
        variants = append(variants, variant)
    }
    if err := cursor.Err(); err != nil {
        response.WriteHeader(http.StatusInternalServerError)
        response.Write([]byte(`{ "message": "` + err.Error() + `"}`))
        return
    }
    json.NewEncoder(response).Encode(variants)
}

那我在这里想念什么?如我所说,我是Go语言的新手,所以我可能不太了解语言和mongo驱动程序的工作原理

1 个答案:

答案 0 :(得分:0)

  

当我尝试获取整个集合时,不返回ObjData字段

返回嵌套字段ObjData,但未将其解码为提供的结构。

这是因为结构ObjDataType具有一个不符合返回文档的值。该结构已将Ratio定义为float64,但是文档在0中的值为string

您可以通过更改结构定义或文档值来解决此问题。即将结构更改为:

type ObjDataType struct {
    Type       string   `json:"type,omitempty" bson:"_t,omitempty"`
    CanBuy     bool     `json:"canbuy,omitempty" bson:"CanBuy,omitempty"`
    Foreground string   `json:"foreground,omitempty" bson:"Foreground,omitempty"`
    Background string   `json:"background,omitempty" bson:"Background,omitempty"`
    HasRatio   bool     `json:"hasratio,omitempty" bson:"HasRatio,omitempty"`
    Ratio      string  `json:"ratio,omitempty" bson:"Ratio,omitempty"`
    HasPadding bool     `json:"haspadding,omitempty" bson:"HasPadding,omitempty"`
    Padding    int      `json:"padding,omitempty" bson:"Padding,omitempty"`
    Mask       MaskType `json:"mask,omitempty" bson:"Mask,omitempty"`
}

关于学习过程的一个额外提示,您可以使用bson.M而不是结构来调试代码的解码部分。例如:

for cursor.Next(ctx) {
    var variant bson.M
    cursor.Decode(&variant)
    variants = append(variants, variant)
    fmt.Println(variant)
}