首页 > 解决方案 > MongoDB 获取集合中的所有文档会使用 mgo 提供一个空的结构切片

问题描述

我已通过以下方式将数据插入到 mongodb

  {
     "_id" : ObjectId("5c80e9cc3bf127cfc80ba5dc"),
     "resp" : [
         {
             "name" : "by",
             "gender" : "synced",
             "age" : "response",
             "hobby" : "submitted",
             "mobile" : "revision"
         },
        {
            "name" : "byoooooo",
            "gender" : "sytewed",
            "age" : "se",
            "hobby" : "subed",
            "mobile" : "revissaaon"
        }
    ]
  }

使用这种方法

func (d *CollectDAO) Insert(responses []*models.FormData) error {
  resp := models.Responses{
      Data: responses,
  }
  err := db.C(formsCollection).Insert(resp)
  return err
}

这是插入方法中使用的结构

type FormData struct {
  Name     string `csv:"name" json:"name" bson:"name"`
  Gender   string `csv:"gender" json:"gender" bson:"gender"`
  Age      string `csv:"age" json:"age" bson:"age"`
  Hobby    string `csv:"hobby" json:"hobby" bson:"hobby"`
  MobileNo string `csv:"mobile" json:"mobile" bson:"mobile"`
}

处理程序从文件中读取样本 csv 数据。这是csv数据

name,gender,age,hobby,mobile
by,synced,response,submitted,revision
byoooooo,sytewed,se,subed,revissaaon

然后将其插入 mongo

查询我收藏的所有文档时,我得到一个空响应

func (d *CollectDAO) FindAll() (models.Responses, error) {
    var responses []models.Responses
    err := db.C(formsCollection).Find(nil).All(&responses)
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("all docs %v\n", responses)

    return responses, err
}

当我尝试记录结构的值时,我得到一个空结构。这是我最后用来放入响应切片的响应结构。

type Responses struct {
  Data []*FormData `json:"response"`
}

我究竟做错了什么?我只需要实现一个处理程序,它将集合中的所有数据作为结构返回。

在客户端,我收到此错误

unexpected end of JSON input
{ObjectIdHex("") []}

标签: databasemongodbgomgo

解决方案


mgo包使用bson标签将结构字段映射到 MongoDB 中的文档字段。

所以你的Responses类型应该是这样的:

type Responses struct {
    Data []*FormData `json:"response" bson:"resp"`
}

请注意,您必须使用此结构(带有bson标记)保存文档才能将结果提取到此类型的值中。


推荐阅读