2012-08-17 14 views

Respuesta

38

Usted usa bson. NewObjectId() para generar una ID para insertar.

Esta es la forma en que le inserta un nuevo documento:

i := bson.NewObjectId() 
c.Insert(bson.M{"_id": i, "foo": "bar"}) 

Dado que usted no sabe si va a insertar o actualizar cuando se emite un Upsert, sería superfluo para generar una ID solo para soltarlo justo después de la consulta (en caso de que ocurra una actualización). Es por eso que se genera db-side y se le devuelve cuando corresponda.

+1

¿Cómo podría reemplazar "foo": "barra", con una estructura ya he creado? – Acidic

+2

"Si se reinicia la aplicación, el generador de Id de objeto comenzará desde el principio generando los mismos ID una y otra vez, actualizando así los registros existentes en la base de datos". esto se publica en la segunda respuesta, es REALMENTE importante y no se menciona en la respuesta. Creo que debería editar la respuesta agregando esta información para las personas en el futuro. – cjf93

+0

@ cjf93 Esto no es verdad (¿más?). Si observas la implementación de bson.ObjectId, verás que toma en cuenta la hora actual. Esto también se explica aquí: https://github.com/go-mgo/mgo/issues/392 –

0

Esto no debería suceder, el mgo debería insertar y devolver el Id, ya que si generamos el ObjectId desde la propia aplicación, si la aplicación se reinicia, el generador de Id de objeto comenzará desde el principio generando el mismo Identificación una y otra vez, actualizando así los registros existentes en la base de datos.

Eso es incorrecto, MGO debe confiar en la base de datos para generar esos ID y actualizar el objeto o devolver el objectId del objeto insertado inmediatamente como lo hacen otros lenguajes vinculantes para MongoDB en Python o Java.

+1

Si en lugar de 'bson.NewObjectId()' se usa 'bson.NewObjectIdWithTime (time.Now())' problema de reiniciar la aplicación no sería un problema, ¿verdad? –

+0

Parece bastante imposible leer el documento de ObjectID ya que el método para generar un ObjectID incluye una marca de tiempo y un PID. Si obtiene el PID de muestra y restablece el reloj de su sistema, entonces usted podría potencialmente tener conflictos con ObjectID, de lo contrario su multa. https://docs.mongodb.com/manual/reference/method/ObjectId/ –

0

Siempre puede intentar la función Upsert para obtener la ID generada.

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 ejemplo de código que tengo y funciona bien .....

Cuestiones relacionadas