2011-04-01 21 views
21

¿Cómo puedo convertir un .NET GUID a un MongoDB ObjectID (en C#). Además, ¿puedo volver a convertirlo al mismo GUID del ObjectID?Convertir .NET Guid a MongoDB ObjectID

+5

En el caso general, no puede convertirlo de nuevo porque un GUID tiene 128 bits, mientras que un ObjectId tiene solo 96 bits. El proceso de conversión es con pérdida, y por lo tanto no reversible. –

+0

¿Puedo simplemente establecer el _id para un documento en un GUID, y no usar el ObjectId en absoluto? – Journeyman

+0

Norris: (descargo de responsabilidad Tengo muy poca experiencia en MongoDB) Creo que puede y Mongo no se quejará. Creo que la única razón para elegir ObjectId es ahorrar espacio. Esta otra pregunta http://stackoverflow.com/questions/4125275/mongodb-norm-and-poco podría ayudar. –

Respuesta

28

No puede convertir ObjectId en GUID y viceversa, porque son dos cosas diferentes (diferentes tamaños, algoritmos).

Puede usar cualquier tipo para mongoDb _id incluyendo GUID.

Por ejemplo, en C# piloto oficial debe especificar el atributo [BsonId]:

[BsonId] 
public Guid Id {get;set;} 

[BsonId] 
public int Id {get;set;} 

ObjectId:

Un BSON de objeto es un valor de 12 bytes que consiste en una marca de tiempo de 4 bytes (segundos desde época), una identificación de máquina de 3 bytes , una identificación de proceso de 2 bytes y un contador de 3 bytes . Tenga en cuenta que los campos timestamp y contador deben ser almacenados big endian a diferencia del resto de BSON. Esto se debe a que son en comparación byte a byte y queremos que garanticen un orden mayormente creciente.

GUID:

El valor de un GUID se representa como una cadena hexadecimal de 32 caracteres, como {21EC2020-3AEA-1069-A2DD-08002B30309D}, y es por lo general almacenado como un entero de 128 bits

2

aunque no es una respuesta directa, tenga en cuenta que no hay ningún requisito que _id sea un ObjectID --- solo que sea único.

se puede establecer cualquier tipo válido para _I incluyendo un objeto incrustado o a. Debería estar bien (salvo que se produzcan infracciones de exclusividad) utilizando un GUID para _id; de hecho, ObjectID es realmente solo un GUID personalizado.

8

FYI puede convertir de un oBJECTID a un Guid

public static Guid AsGuid(this ObjectId oid) 
    { 
     var bytes = oid.ToByteArray().Concat(new byte[] { 5, 5, 5, 5 }).ToArray(); 
     Guid gid = new Guid(bytes); 
     return gid; 
    } 

    /// <summary> 
    /// Only Use to convert a Guid that was once an ObjectId 
    /// </summary> 
    public static ObjectId AsObjectId(this Guid gid) 
    { 
     var bytes = gid.ToByteArray().Take(12).ToArray(); 
     var oid = new ObjectId(bytes); 
     return oid; 
    } 
+0

cuando he convertido Guid a ObjectId y nuevamente desde ObjectId a Guid, el resultado es diferente –

+0

Cuando convierte un Guid a un ObjectId, realmente pierde datos. Las conversiones anteriores deben ser una conversión repetible de una vía. – MiddleTommy

+0

Podría ser posible convertir de ObjectId a Guid y viceversa, pero sería necesario investigar un poco. No he usado ObjectId durante los últimos 4 años, así que no sé qué cambios se han realizado en ObjectId Type que necesitarían cambiar el código anterior. Debe escribir algunas pruebas para la conversión de ida y vuelta. – MiddleTommy