在c#中使用BsonRepresentation(BsonType.ObjectId)与BsonId与ObjectId装
本文关键字:ObjectId BsonId BsonType BsonRepresentation | 更新日期: 2023-09-27 18:01:46
我是mongodb的新手,我喜欢不担心模式的东西是多么容易,我有一个问题假设你想要一个Id属性在mongo和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;}
谁能给我解释一下为什么大多数人选择最后一种类型,发生了什么,灵活性有什么帮助?谢谢?
- 如果在强类型
TDocument
类(集合中的项类型)中有一个名为Id, id or _id
的列,那么将在Mongo中生成一个名为"_id"
的列。它还将为该列创建一个索引。你得到一个duplicate key error
异常,如果试图插入一个项目与一个已经存在的键。
public ObjectId Id {get; set;}
将使用ObjectId
的类型生成器,它看起来像
_id: ObjectId("57ade20771e59f422cc652d9")
同样:
public Guid _id { get; set; }
将使用Guid生成器生成类似
的内容。"_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==")
还有以下所有属性
public int Id { get; set; }
public string id { get; set; }
public byte[] _id { get; set; }
如果未指定,将使用每种类型的默认值作为索引列。
-
[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]
装饰的不能作为索引列。
-
[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; }
-