gpt4 book ai didi

json - 将 slice 结果 JSON 插入 MongoDB

转载 作者:IT王子 更新时间:2023-10-29 02:02:02 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com