json - 将 slice 结果 JSON 插入 MongoDB

标签 json mongodb go slice mgo

我在 Gin 框架中使用 MongoDB 的 mgo 驱动程序。

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

我有一个尝试将 slice 转换为 JSON 的函数。

这里的 slice 是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()
   }

运行它我得到以下错误:

错误插入文档 [0] 的类型错误。期望一个对象,得到一个数组。

最佳答案

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

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

您应该注意的一件事是它需要 interface{} 值。任何类型的值都有资格“成为”接口(interface){}。您应该注意的另一件事是,只有 slice 类型 []interface{} 才有资格成为 []interface{},用户 slice []User 没有。有关详细信息,请参阅 Type converting slices of interfaces in go

因此只需创建您的用户 slice 的副本,其中副本具有 []interface{} 类型,并且您可以直接将其传递给 Collection.Insert():

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

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

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

关于json - 将 slice 结果 JSON 插入 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50230483/

相关文章:

javascript - 如何在 Node 中创建一个带有变量名的 Mongo 集合?

mongodb - 将新字段添加到具有现有字段值的集合

arrays - 如何从 Go 向 C 发送字节数组

javascript - 迭代响应数据以创建谷歌地图对象

javascript - 在 Javascript 中使用用户指定的参数作为键

java - 在 Java 中将 URL 参数转换(解析)为 JSON

javascript - 如何在node js中获取promise之外的结果

xml - 如何从XML字符串中删除XML意向?

loops - range 子句针对 map 等不同的数据结构类型返回哪些不同的变量?

Jquery 获取 JSON 数据