GUID在C# code和MongoDB GUI裡面顯示的值不同

遭遇GUID在C# code和MongoDB GUI裡面顯示的值不同,這是怎麼回事呢?

新專案在研究MongoDB的時候,發現了透過C#存入的GUID與透過MongoDB GUI看到的GUID不同的問題,

測試的程式碼

  class Program
  {
    static void Main(string[] args)
    {
      //BsonDefaults.GuidRepresentation = GuidRepresentation.PythonLegacy;
      Console.WriteLine(BsonDefaults.GuidRepresentation);
      var client = new MongoClient("mongodb://localhost:27020");
      var database = client.GetDatabase("local");
      var collection = database.GetCollection<Test>("Test");
      var guid = Guid.NewGuid();
      collection.InsertOne(new Test()
      {
              _id =  guid
      });

      Console.WriteLine($"Save GUID:{guid}");
    }
  }

  class Test
  {
    public Guid _id { get; set; }
  }

存入的GUID在C# code裡面在MongoDB GUI(使用NoSQLBooster)裡面顯示的GUID

主要的原因是因為MongoDB C# Driver針對GUID的是預設使用 BsonDefaults.GuidRepresentation = GuidRepresentation.CSharpLegacy來讀取binary data,從BSON spec上來看,應該是subtype 4,但是MongoDB卻是使用subtype 3來處理,所以導致GUI上顯示的值不同

(http://bsonspec.org/spec.html)解決這個問題其實很簡單,利用以下的程式碼就可以指定MongoDB C# Driver使用subtype 3,
BsonDefaults.GuidRepresentation = GuidRepresentation.PythonLegacy; //全域設定

在執行一次code就會看到兩邊顯示的GUID相同

實際上在C#裡面直接產生GUID存入,再直接讀出是沒有問題的,會發現這個問題是在處理整合測試要用的假資料上,直接指定C#讀取某個GUID的資料,結果一直為空。有在MongoDB裡面使用GUID的朋友需要注意一下。