在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;}
谁能给我解释一下为什么大多数人选择最后一种类型,发生了什么,灵活性有什么帮助?谢谢?

在c#中使用BsonRepresentation(BsonType.ObjectId)与BsonId与ObjectId装

  1. 如果在强类型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; }