将切片结果 JSON 插入 MongoDB

Insert a slice result JSON into MongoDB

我正在使用 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.

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

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

您应该注意的一件事是它需要 interface{} 值。任何类型的值都限定 "to be" 和 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。做一次,在应用程序启动时,存储全局连接/会话,并在需要时克隆/复制它。有关详细信息,请参阅 ; and