15

一个应用程序在 Mongo 中保留 Guid 字段,它最终被存储为 BinData:

"_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); }
    }
}
4

2 回答 2

15

除了 gregor 的回答,使用 Guids 目前将阻止使用新的聚合框架,因为它表示为二进制类型。无论如何,你可以用更简单的方式做你想做的事。这将让 mongodb bson 库为您处理转换。

public class MyClass
{
  [BsonRepresentation(BsonType.String)]
  public Guid Id { get; set;}
}
于 2012-08-14T12:13:49.190 回答
5

缺点是 mongodb 已针对使用 BSON ObjectID 进行了优化,因此使用字符串作为 ObjectID 的效率会稍低一些。此外,如果您想对字符串 ObjectID 使用基于范围的查询,则将使用字典比较,这可能会产生与您预期不同的结果。除此之外,您可以使用字符串作为 ObjectID。请参阅优化 ObjectIDs http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

于 2012-08-14T11:34:57.753 回答