2011-04-01 70 views
21

如何將.NET GUID轉換爲MongoDB ObjectID(在C#中)。另外,我可以將它再次從ObjectID轉換回相同的GUID嗎?將.NET Guid轉換爲MongoDB ObjectID

+5

在一般情況下,由於GUID有128位,而ObjectId只有96位,所以不能將其轉換回來。轉換過程是有損的,因此不可逆轉。 – 2011-04-01 13:35:17

+0

我可以只將文檔的_id設置爲GUID,並且根本不使用ObjectId? – Journeyman 2011-04-01 13:46:21

+0

Norris :(聲明我有很少的MongoDB經驗)我認爲你可以和Mongo不會抱怨。我認爲選擇ObjectId的唯一理由是節省空間。這個其他問題http://stackoverflow.com/questions/4125275/mongodb-norm-and-poco可能會有所幫助。 – 2011-04-01 13:48:16

回答

28

您不能將ObjectId轉換爲GUID,反之亦然,因爲它們是兩個不同的東西(不同的大小,算法)。

您可以使用任何類型的mongoDb _id,包括GUID

例如,在正式C#駕駛員應指定屬性[BsonId]

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

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

ObjectId

甲BSON的ObjectID是由一個4字節的時間戳 的一個12字節的值 (秒以來的秒數),一個3字節的機器ID,一個2字節的進程ID和一個3字節的計數器。請注意, 時間戳和計數器字段必須是 存儲的大端序列號,與其他的 BSON不同。這是因爲他們是 逐字節比較,我們想要 確保大多數增加的順序。

GUID

一個GUID的值被表示爲 一個32個字符的十六進制字符串,如 {21EC2020-3AEA-1069-A2DD-08002B30309D}, 且通常是存儲爲128位 整數

2

雖然不是一個直接的答案,請記住,沒有要求_id是一個ObjectID ---只是它是唯一的。

任何有效的類型都可以設置爲_I'd,包括一個嵌入對象或一個。你應該沒問題(禁止任何唯一性違規)使用_id的GUID;實際上,ObjectID實際上只是一個自定義的GUID。

8

FYI您可以從轉換的ObjectId爲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

當我已經轉換爲Guid到ObjectId並再次從ObjectId到Guid時結果不同 – 2017-04-06 13:50:15

+0

當您將Guid轉換爲ObjectId時,實際上會丟失數據。上述轉換是單向可重複轉換。 – MiddleTommy 2017-04-06 21:05:58

+0

它可以從ObjectId轉換爲Guid並返回,但需要一些研究。我最近4年沒有使用ObjectId,因此我不知道對ObjectId類型做了哪些更改,以便更改上述代碼。你應該爲來回的轉換寫一些測試。 – MiddleTommy 2017-04-06 21:12:58