Вставить результат среза JSON в MongoDB - PullRequest
0 голосов
/ 08 мая 2018

Я использую драйвер mgo для MongoDB с каркасом 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 голосов
/ 08 мая 2018

Вставка нескольких документов аналогична вставке одного документа, поскольку метод Collection.Insert() имеет переменный параметр:

func (c *Collection) Insert(docs ...interface{}) error

Стоит отметить, что он ожидает interface{} значений. Значение любого типа квалифицируется как «быть» и interface{}. Следует также отметить, что только тип среза []interface{} квалифицируется как []interface{}, а пользовательский срез []User - нет. Подробнее см. Тип преобразования фрагментов интерфейсов в 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 - производительность запросов кажется постоянно низкой (500-650 мс) ; и слишком много открытых файлов на сервере mgo go .

...