Проблема с установкой при использовании mgo

# #mongodb #go

Вопрос:

Пожалуйста, скажите мне, кто столкнулся с этим при работе с Монго через mgo. Мне нужно обновить документ, если документа нет, вставьте новый, я использую Upsert():

 entry := models.Example{
    ID:           bson.NewObjectId(),
    UserID:       userID,
    SessionID:    sessionID,
    Created:      created,
  }

query := bson.M{
  "$set": entry,
}

_, err = mongo.C(mongodb.ExampleCollection).Upsert(bson.M{
  "user_id":      userID,
  "session_id":   sessionID,
}, query)
 

Таким образом, он вставляет документ, и при обновлении он разрывается (amp; mgo.lastError {Ошибка: «Выполнение обновления пути ‘_id’ приведет к изменению неизменяемого поля ‘_id'», …}), если вы удалите ранее сгенерированный идентификатор, он не сможет вставить его без идентификатора.

Я также читал о $setOnInsert, но, по-видимому, это не работает так на ID:

 query := bson.M{
  "$setOnInsert": bson.M{
    "_id": bson.NewObjectId(),
  },
  "$set": entry,
}
 

Комментарии:

1. Сообщение об ошибке кажется довольно ясным. Вы не можете обновить идентификатор объекта. Просто не устанавливайте его вообще, и mongodb сгенерирует его для вас при вставке нового документа.

2. no mongo не устанавливает его автоматически, если в структуре нет идентификатора, возникает ошибка: amp;errors.errorString{s:»Длина объектов должна быть ровно 12 байт (0)»}

3. Нет, если идентификатор присутствует, он должен быть действительным. Если вы его вообще не установите, он будет работать.

4. нет, если я оставлю его пустым, то произойдет указанная ошибка. например, если запись выглядит так, но модель имеет идентификатор, то будет возвращена ошибка: запись := модели. Пример{ Идентификатор пользователя: Идентификатор пользователя, идентификатор сеанса: Идентификатор сеанса, Создан: создан, }

5. Извините, я просто забыл добавить тег «опущено», затем генерируется идентификатор, проблема заключалась в том, что

Ответ №1:

В моем конкретном случае добавление «опущенной» к тегу bson помогло мне. Без него я не мог писать в одном из случаев без идентификатора, он не был сгенерирован автоматически.

 models.Example{
    ID    bson.ObjectId    `bson:"_id,omitempty"`
    ...
}