mongodb - go mgo
Golang/mgo: ¿Por qué mgo no devuelve el ID del documento insertado? (3)
De acuerdo con la documentación ( http://godoc.org/launchpad.net/mgo/v2 ), puede obtener el ID de su documento "Upserted" si utiliza el método Upsert.
También hay un método de inserción que no proporciona esta funcionalidad.
¿Porqué es eso? ¿Qué sucede si deseo realizar un Insertar en lugar de un Upsert? (¿o no sería una razón válida para querer hacer eso? Estoy empezando a preguntarme).
Esto no debería suceder en absoluto, el mgo debería insertar y devolver la ID, ya que, si generamos el ObjectId desde la propia aplicación, si la aplicación se reinicia, el generador de la Id. Del objeto comenzará desde el principio generando las mismas ID una y otra vez , actualizando así los registros existentes en la base de datos.
Eso es incorrecto, MGO debería confiar en la base de datos para generar esos ID y actualizar el objeto o devolver el ID de objeto del objeto insertado inmediatamente, como lo hacen otros lenguajes vinculados a MongoDB en Python o Java.
Siempre puede probar la función Upsert para obtener el ID generado.
db := service.ConnectDb()
sessionCopy := db.Copy()
defer sessionCopy.Close() // clean up
collection := sessionCopy.DB(service.MongoDB.DTB).C(MessageCol.tbl)
log.Println("before to write: ", msg)
// Update record inserts and creates an ID if wasn''t set (Returns created record with new Id)
info, err := collection.Upsert(nil, msg)
if err != nil {
log.Println("Error write message upsert collection: ", err)
return MessageMgo{}, err
}
if info.UpsertedId != nil {
msg.Id = info.UpsertedId.(bson.ObjectId)
}
// gets room from mongo
room, err := GetRoom(msg.Rid)
if err != nil {
return msg, err
}
// increments the msgcount and update it
room.MsgCount = room.MsgCount + 1
err = UpdateRoom(room)
if err != nil {
return msg, err
}
return msg, err
Este es un código de muestra que tengo y funciona bien .....
Usted usa bson
. NewObjectId()
para generar un ID para insertar.
Así es como insertarías un nuevo documento:
i := bson.NewObjectId()
c.Insert(bson.M{"_id": i, "foo": "bar"})
Dado que no sabe si va a insertar o actualizar cuando emita un Upsert
, sería superfluo generar una ID solo para Upsert
justo después de la consulta (en caso de que ocurra una actualización). Es por eso que se genera db-side y se te devuelve cuando corresponda.