将切片结果JSON插入MongoDB

时间:2018-05-08 09:37:01

标签: json mongodb go slice mgo

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

1 个答案:

答案 0 :(得分:2)

插入多个文档与插入单个文档相同,因为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