我在 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/