2015-08-31 1 views
1

Я действительно новичок в использовании go, mgo и gin gonic ... Я создаю мини-приложение, и у меня возникла проблема с вводом нового регистра в mongoDB с использованием mgo. Моя ошибка говорит:Вставка поля ISODate с использованием ошибки mgo

«PANIC: Ошибка синтаксического анализа элемента 0 полевых документов :: вызвано :: неправильный тип для поля '0', неожиданный объект 0: [{дата: новый Дата (1441051152939), из: "11", в: "12", офис: "2", cLIENT_ID: "1368465545"}] _»

Моя структура является следующий:

type Reservation struct { 
     ID  bson.ObjectId `bson:"_id,omitempty" json:"_id"` 
     Date  time.Time  `bson:"date" json:"date"` 
     From  string  `bson:"from" json:"from"` 
     To  string  `json:"to"` 
     Office  string  `json:"office"` 
     Client_id string  `json:"client_id"` } 

И я пытаюсь вставить его следующим образом, используя gin-gonic и mgo:

func addReservation(c *gin.Context) { 

      x := session.DB("projXXXX").C("reservation") 
      var reservations []Reservation 
      c.Bind(&reservations)>    
      err := x.Insert(&reservations) 
      if err != nil { 
       panic(err) 
      } 
      c.String(200,"whatever") 
} 

Моя коллекция в MongoDB, как это:

{ 
    "_id" : ObjectId("55ba2e611cb87b9a6d75e94b"), 
    "date" : ISODate("2015-10-22T00:00:00.000Z"), 
    "from" : "9", 
    "to" : "10", 
    "office" : "4", 
    "client_id" : "1123456469797" 
} 

Большое спасибо за вашу помощь

+0

Попытка поймать ошибку из 'c.Bind()' вызова и распечатать его на экран. Вероятно, есть ошибка, и оговорки пусты, поэтому Вставка() не выполняется. Кроме того, почему некоторые из полей имеют тег «bson», а другие нет? – divan

ответ

3

С видом ошибки, MongoDB видит массив, в котором он ожидает увидеть один объект. Похоже, проблема заключается в том, что вы пытаетесь вставить фрагмент []Reservation как отдельный объект.

Вместо того, чтобы принимать фрагмент объектов для вставки, Collection.Insert принимает каждый объект для вставки в качестве отдельного аргумента. Вы, вероятно, хотите использовать the special ... syntax for calling a variadic function:

err := x.Insert(reservations...) 
+0

Да Я пытаюсь вставить несколько объектов одновременно. Я попытался вставить один за раз с помощью foreach, и он работает ... что-то вроде этого: for _, reserve: = резервирование диапазона { err: = x.Insert (и Бронирование {Дата: reserv.Date, От: reserv.From, To: reserv.To, офис: reserv.Office, cLIENT_ID: reserv.Client_id}) , если допустить ошибку = ноль { паника (ERR) }} –

+0

! Вы должны иметь возможность сделать это с помощью одного вызова Insert(), как я предлагаю в ответ. Синтаксис '...' вызывает метод, как если бы каждый элемент среза передавался как отдельный аргумент. –