# #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"`
...
}