天天看點

Mongodb中GUID的顯示問題

最近将一個程式的存儲遷移到了Mongodb,發現了一個現象,Guid類型寫入後,在程式裡面讀取的和用用戶端工具展示的不一樣,一個簡單的示例如下:

    var doc = new {_id = 1, Value = Guid.Parse("{B63932BB-9688-432B-B3A0-C4AE3FD2696A}") };

    collection.InsertOne(doc.ToBsonDocument());

寫入DB後,我們從用戶端工具來檢視它:

Mongodb中GUID的顯示問題

通過對比可以發現,展示的值和寫入的形式不一樣,但是讀取到的值卻是沒有問題的。這個問題可以從官方的文檔規範中找到答案:

官方文檔: http://bsonspec.org/spec.html

Mongodb中GUID的顯示問題

Mongodb中是将uuid其作為二進制類型存儲的,用一個subtype來标記其類型為uuid,在對C#,java,python提供的驅動中,預設是将其子類型映射了為3(Legacy UUID),這個在用戶端工具中也是有所展示的:

Mongodb中GUID的顯示問題

實際上,大多數用戶端工具也是能支援将Legacy UUID展示成我們寫入時候的那個樣子。

Mongodb中GUID的顯示問題
Mongodb中GUID的顯示問題

雖然這個不影響程式的功能,但由于第一眼看到的字元串不是寫入的格式,很多時候是影響我們調試程式的。一個較好的解決方法是預設将以标準的UUID格式存儲,隻需要設定一個全局配置即可:

    BsonDefaults.GuidRepresentation = GuidRepresentation.Standard; 

新版本的MongoDB的API為:   

  BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));

這樣就友善多了:

Mongodb中GUID的顯示問題

參考文章:

MongoDB Best Practices for UUID Data