【问题标题】:What are drawbacks of storing Guid as String in MongoDB?在 MongoDB 中将 Guid 存储为字符串有什么缺点?
【发布时间】:2012-08-13 21:41: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); }
    }
}

【问题讨论】:

标签: mongodb mongodb-.net-driver


【解决方案1】:

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

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

【讨论】:

  • 我可以使用例如 BsonString 作为变量的类型,例如 'public BsonString Name {get;放; }
  • 请注意,这不再是 2.6 中的聚合框架的问题。
  • @Idan,不要在你的类中使用 BsonString,使用字符串。驱动程序知道如何在这些之间进行序列化。
  • 我不应该认为这个限制在服务器 2.6 中消失了。聚合框架现在可以使用 Guid。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多