Проблема с 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 шт):
_id генерируется автоматически. Он же является неким первичным ключом.
Ваша схема в коде должна содержать поле с тэгом id, тогда монго поймет, что нужно использовать его как ObjectID. Запрещается использовать _id, потому что он создается автоматически.
замените myfield json:"id" bson:"_id" на myfield json:"id" bson:"id"