将切片结果 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 。
我正在使用 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。做一次,在应用程序启动时,存储全局连接/会话,并在需要时克隆/复制它。有关详细信息,请参阅