2012-08-13 55 views
7

的應用仍然存在GUID字段中蒙戈和它結束了被存儲爲BinData:在MongoDB中存儲Guid as String的缺點是什麼?

"_id" : new BinData(3, "WBAc3FDBDU+Zh/cBQFPc3Q==") 

的優點在這種情況下是緊湊,缺點時顯示一個需要解決的應用。 Guid通過URL傳遞,並且在進入Mongo控制檯時不斷將它們轉換爲BinData有點痛苦。

除了增加尺寸外,還存儲Guid作爲字符串的缺點?一個優點是簡化故障排除:

"_id" : "3c901cac-5b90-4a09-896c-00e4779a9199" 

這裏是一個持久化實體的在C#中的原型:

class Thing 
{ 
    [BsonIgnore] 
    public Guid Id { get; set; } 

    [BsonId] 
    public string DontUseInAppMongoId 
    { 
     get { return Id.ToString(); } 
     set { Id = Guid.Parse(value); } 
    } 
} 
+0

記憶,空間和時間查詢和索引大小有一些,你可以做什麼來優化是這樣的:http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-StoreBinaryGUIDsasBinData %2Cratherthanashexencodedstrings – Sammaye 2012-08-13 21:59:09

+0

這就是你實際上在做atm,抱歉沒有完全讀完問題。 – Sammaye 2012-08-13 22:00:02

+0

你可能想檢查一下我的相關問題的答案:http://stackoverflow.com/a/22607171/253098 – SystematicFrank 2014-03-24 11:17:26

回答

8

除了格里高爾的答案,使用的GUID將目前防止利用新的聚合框架,因爲它表示爲二進制類型。無論如何,你可以以更簡單的方式做你想做的事。這將讓mongodb bson庫爲您處理轉換。

public class MyClass 
{ 
    [BsonRepresentation(BsonType.String)] 
    public Guid Id { get; set;} 
} 
+0

我可以使用例如BsonString作爲變量的類型,例如'public BsonString Name {get;組; } – 2014-08-02 09:29:34

+2

需要注意的是,這不再是2.6中的聚合框架的問題。 – 2014-08-02 17:21:58

+0

@Idan,不要在您的類中使用BsonString,請使用字符串。驅動程序知道如何序列化這些數據。 – 2014-08-02 17:22:37

5

缺點是MongoDB是優化使用BSON對象ID的,因此會稍微低效率使用字符串作爲ObjectID的。另外,如果你想對字符串ObjectIDs使用基於範圍的查詢,那麼將會使用一個詞典對比,這可能會給出與你預期不同的結果。除此之外,您可以使用字符串作爲ObjectID。 請參閱優化的ObjectID http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

相關問題