Проблема с Upsert при использовании mgo

Подскажите пожалуйста, кто сталкивался с этим при работе с монгой через 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)

Так оно вставляет документ, а при апдейте ломается (&mgo.LastError{Err:"Performing an update on the path '_id' would modify the immutable field '_id'", ...}), если убрать ранее сгенерированный ID, то он не может вставить его без ID.

Прочитал еще про $setOnInsert, но он видимо так на ID не работает:

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

Ответы (1 шт):

Автор решения: Senior Pomidor

_id генерируется автоматически. Он же является неким первичным ключом.

Ваша схема в коде должна содержать поле с тэгом id, тогда монго поймет, что нужно использовать его как ObjectID. Запрещается использовать _id, потому что он создается автоматически.

замените myfield json:"id" bson:"_id" на myfield json:"id" bson:"id"

→ Ссылка