使用BsonRepresentation(BsonType.ObjectId)与BsonId对比ObjectId来修饰C#中的属性之间的区别

Mic*_*uru 9 c# mongodb mongodb-query

我是mongodb的新手,我很喜欢不用担心架构的问题,我有一个问题,假设你想在mongo中使用Id属性而mongo ObjectId用来表示属性Id,到目前为止我看到你可以拥有或装饰一个Id作为如下,

public ObjectId Id {get; set;}

//or

[BsonId]
public string Id {get; set;}

//or

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id {get; set;}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么大多数人选择最后一种类型,以及最新情况以及灵活性如何帮助.谢谢?

and*_*ian 20

1)如果Id, id or _id在强类型TDocument类(集合中的项类型)中有一个名为column的列,"_id"则将在Mongo中生成一个名为column的列.它还将为该列创建索引.duplicate key error如果尝试插入具有已存在的键的项,则会出现异常.

public ObjectId Id { get; set; }将使用类型生成器ObjectId,它看起来像_id: ObjectId("57ade20771e59f422cc652d9").

public Guid _id { get; set; }将使用Guid生成器生成smth之类的"_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==").

public int Id { get; set; },public string id { get; set; },public byte[] _id { get; set; }也将是如果没有指定使用的默认值对于每种类型的索引列.

2)[BsonId]为您提供了以任何方式命名索引的灵活性.[BsonId] public Guid SmthElseOtherThanId { get; set; }并且[BsonId] public string StringId { get; set; }将指标; public Guid SmthElseOtherThanId { get; set; }并且public string StringId { get; set; }不会.mongodb仍将在_id内部使用.

相同的逻辑,public ObjectId SmthElseOtherThanId {get; set;}没有[BsonId]装饰将不是索引列.

3)如果它们之间有转换[BsonRepresentation],你可以使用Mongo类型和内部.Net类型.

[BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; }相同的public ObjectId Id { get; set; }.

拥有[BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; }却不同.Mongo会自动生成对象ID,但是你可以在.net中使用字符串,过滤查询等,因为对象id和字符串之间存在转换.

已经[BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; }[BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; }将要失败的ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer消息.

但是[BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; }会很好.

  • 谢谢,类型转换所经历的任何性能损失,在规模上是否明显。 (2认同)