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