应用程序在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); }
}
}
除了 gregor 的答案之外,使用 Guids 目前将阻止使用新的聚合框架,因为它表示为二进制类型。 无论如何,你可以用更简单的方式做你想做的事。 这将让 mongodb bson 库为您处理转换。
public class MyClass
{
[BsonRepresentation(BsonType.String)]
public Guid Id { get; set;}
}
缺点是mongodb被优化为使用BSON ObjectID,因此使用字符串作为ObjectID的效率会稍微低一些。此外,如果要对字符串 ObjectID 使用基于范围的查询,则将使用词典比较,这可能会给出与预期不同的结果。除此之外,您还可以使用字符串作为对象 ID。请参阅优化对象标识http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs