golang mgo 建模问题

golang mgo modelling issue

我有这个模型数据,我用它来将数据保存到数据库中

type Nos struct {
  UnitCode       string    `json:"unitCode" bson:"unitCode"`    
  Version        string    `json:"version" bson:"version"`

  Reviews struct {
    ReviewCommentsHistory []reviewCommentsHistory `json:"reviewCommentsHistory" bson:"reviewCommentsHistory"`
}
  ID        bson.ObjectId `bson:"_id"`
  CreatedAt time.Time     `bson:"created_at"`
  UpdatedAt time.Time     `bson:"updated_at"`
}

type reviewCommentsHistory struct {
    ReviewHistoryDate time.Time `json:"reviewHistoryDate" bson:"reviewHistoryDate,omitempty"`   
}

我的mongodb数据如下

{
"_id" : ObjectId("5a992d5975885e236c8dc723"),
"unitCode" : "G&J/N3601",
"version" : "3",    
"Reviews" : {
    "reviewCommentsHistory" : [ 
        {
            "reviewHistoryDate" : ISODate("2018-04-28T18:30:00.000Z")              
        }
    ]
}
}

使用golang包mgo我写了下面一段代码来获取文档

func (nosDal NosDal) FindNos(unitCode string, version string) ([]model.Nos, error) {
    var result []model.Nos
    var err error
    col := repository.DB.C("nos")   
    err = col.Find(bson.M{"unitCode": strings.ToUpper(unitCode), "version": version}).All(&result)
    fmt.Println(result[0])
    return result, err
}

我的回复 returns Reviews.reviewCommentsHistory 的空值。我的模型有问题吗?任何关于如何检查响应是否映射到我的模型的指示都会有用

这是我的输出

{
"unitCode": "G&J/N3601",    
"version": "3",    
"Reviews": {
    "reviewCommentsHistory": null
},
"ID": "5a992d5975885e236c8dc723",
"CreatedAt": "2018-03-02T16:24:17.19+05:30",
"UpdatedAt": "2018-03-05T18:04:28.478+05:30"
}

问题是您没有为 Nos.Reviews 字段指定任何 bson 标记,这意味着将应用默认映射,这意味着字段名称将使用小写字母: "reviews"。但是你的 MongoDB 包含大写字母的文档:"Reviews",所以映射会失败(解组不会将 MongoDB "Reviews" 匹配到 Nos.Reviews 字段).

指定缺少的标签:

Reviews struct {
    ReviewCommentsHistory []reviewCommentsHistory `json:"reviewCommentsHistory" bson:"reviewCommentsHistory"`
} `json:"Reviews" bson:"Reviews"`

它会起作用。