【问题标题】:Insert a slice result JSON into MongoDB将切片结果 JSON 插入 MongoDB
【发布时间】:2018-05-08 09:37:01
【问题描述】:

我正在使用用于 MongoDB 的 mgo 驱动程序和 Gin 框架。

type  Users struct {
    User_id *string  `json:"id user" bson:"id user"`
    Images  []string `json:"images" bson:"images"`
}

我有这个函数试图将切片转换为 JSON。

这里的切片是UsersTotal

func GetUsersApi(c *gin.Context) {

    UsersTotal, err := GetUsers()

    if err != nil {
        fmt.Println("error:", err)
    }

    c.JSON(http.StatusOK, gin.H{
        "Count Users": len(UsersTotal),
        "Users Found ": UsersTotal,
    })


    session, err := mgo.Dial(URL)
    if err == nil {
        fmt.Println("Connection to mongodb established ok!!")
        cc := session.DB("UsersDB").C("results")

        err22 := cc.Insert(&UsersTotal)
        if err22 != nil {
            fmt.Println("error insertion ", err22)
        }
    }
    session.Close()
   }

运行它我得到以下错误:

error insertion Wrong type for documents[0]. Expected a object, got a array.

【问题讨论】:

  • GetUsers 是否返回 []Users, error
  • 是的@Hadi,它返回一个array of Users 和一个error 来检查,我的问题是将这个slice: UsersTotal 插入我的mongoDB
  • 嗯,请遍历您的数组,然后插入每个数组。我认为它会起作用。
  • @Hadi 你的意思是像在切片上做一个范围并尝试在每一行上迭代,这听起来会影响运行时,我在这里处理一个巨大的结果
  • 试试这个cc.Insert(UsersTotal...)@Data_Geek

标签: json mongodb go slice mgo


【解决方案1】:

插入多个文档与插入单个文档相同,因为Collection.Insert() 方法具有可变参数:

func (c *Collection) Insert(docs ...interface{}) error

您应该注意的一件事是它需要interface{} 值。任何类型的值都可以“成为”interface{}。您应该注意的另一件事是,只有切片类型 []interface{} 有资格成为 []interface{},而用户切片 []User 则没有。详情见Type converting slices of interfaces in go

因此,只需创建用户切片的副本,其中副本的类型为[]interface{},您可以直接传递给Collection.Insert()

docs := make([]interface{}, len(UsersTotal))
for i, u := range UsersTotal {
    docs[i] = u
}

err := cc.Insert(docs...)
// Handle error

另外,请不要在您的处理程序中连接到 MongodB。做一次,在应用程序启动时,存储全局连接/会话,并在需要时克隆/复制它。详情见mgo - query performance seems consistently slow (500-650ms);和too many open files in mgo go server

【讨论】:

  • @Data_Geek 如果没有错误,那么要么传递 0 个要插入的文档,要么在错误的位置查找插入的文档(例如,另一个数据库、另一个集合等)。如果一切似乎都匹配,请编辑问题并发布您尝试过的代码(包括错误处理)。
  • ,这是一个错误的数据库切换,非常感谢您的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2017-12-13
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多