2011-04-01 6 views
21

Comment convertir un GUID .NET en un ID d'objet MongoDB (en C#). Aussi, puis-je le convertir à nouveau le même GUID à partir de l'ObjectID?Conversion de GUID .NET en ID d'objet MongoDB

+5

Dans le cas général, vous ne pouvez pas le reconvertir car un GUID a 128 bits, alors qu'un ObjectId n'a que 96 bits. Le processus de conversion est à perte, et donc non réversible. –

+0

Puis-je simplement définir le _id pour un document à un GUID, et ne pas utiliser l'ObjectId du tout? – Journeyman

+0

Norris: (avertissement J'ai très peu d'expérience MongoDB) Je pense que vous pouvez et Mongo ne se plaindra pas. Je pense que la seule raison de choisir ObjectId est de gagner de la place. Cette autre question http://stackoverflow.com/questions/4125275/mongodb-norm-and-poco pourrait aider. –

Répondre

28

Vous ne pouvez pas convertir ObjectId en GUID et vice versa, car ce sont deux choses différentes (tailles différentes, algorithmes).

Vous pouvez utiliser n'importe quel type pour mongoDb _id, y compris GUID.

Par exemple dans le pilote officiel C#, vous devez spécifier l'attribut [BsonId]:

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

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

ObjectId:

A BSON ObjectID est une valeur de 12 octets composé d'un horodatage de 4 octets (secondes depuis l'époque), un identifiant machine de 3 octets , un identifiant de processus de 2 octets et un compteur de 3 octets. Notez que les champs d'horodatage et de compteur doivent être stockés en big endian contrairement au reste de BSON. C'est parce qu'ils sont comparés octet par octet et nous voulons assurer un ordre en grande partie croissant.

GUID:

La valeur d'un GUID est représenté sous la forme une chaîne de 32 caractères hexadécimaux, tels que {21EC2020-3AEA-1069-A2DD-08002B30309D}, et est généralement stocké sous forme de 128 bits entier

2

Bien que ce ne soit pas une réponse directe, gardez à l'esprit qu'il n'y a aucune exigence que _id soit un ObjectID --- seulement qu'il soit unique.

tout type valide peut être défini pour _Id incluant un objet incorporé ou un. vous devriez être bien (en excluant toute violation d'unicité) en utilisant un GUID pour _id; en fait, ObjectID est vraiment juste un GUID personnalisé.

8

pour votre information Vous pouvez convertir un ObjectId à 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

lorsque je suis converti en Guid à ObjectId et de nouveau à partir de ObjectId vers le Guid le résultat est différent –

+0

Lorsque vous convertissez un Guid en un ObjectId vous perdez réellement des données. Les conversions ci-dessus doivent être une conversion répétable à sens unique. – MiddleTommy

+0

Il pourrait être possible de convertir de ObjectId à Guid et revenir, mais il faudrait faire quelques recherches. Je n'ai pas utilisé ObjectId pour les 4 dernières années, donc je ne sais pas quelles modifications ont été apportées au type ObjectId qui aurait besoin de changer le code ci-dessus. Vous devriez écrire quelques tests pour la conversion d'avant en arrière. – MiddleTommy