在MongoDB中将Guid存储为String有什么缺点?

Yur*_*rev 11 mongodb mongodb-.net-driver

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

"_id" : new BinData(3, "WBAc3FDBDU+Zh/cBQFPc3Q==")
Run Code Online (Sandbox Code Playgroud)

在这种情况下的优点是紧凑性,当需要对应用程序进行故障排除时会出现缺点.Guids通过URL传递,并且在转到Mongo控制台时不断将它们转换为BinData有点痛苦.

除了增加尺寸外,将Guid存储为字符串有什么缺点?一个优点是易于故障排除:

"_id" : "3c901cac-5b90-4a09-896c-00e4779a9199"
Run Code Online (Sandbox Code Playgroud)

这是C#中持久化实体的原型:

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

    [BsonId]
    public string DontUseInAppMongoId
    {
        get { return Id.ToString(); }
        set { Id = Guid.Parse(value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*son 11

除了gregor的答案之外,使用Guids还会阻止使用新的Aggregation Framework,因为它表示为二进制类型.无论如何,您可以更轻松地完成您想要的任务.这将让mongodb bson库处理为您进行转换.

public class MyClass
{
  [BsonRepresentation(BsonType.String)]
  public Guid Id { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,这不再是2.6中聚合框架的问题. (2认同)

gea*_*kie 5

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