gpt4 book ai didi

c# - 使用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性的区别

转载 作者:太空狗 更新时间:2023-10-29 17:37:39 26 4
gpt4 key购买 nike

我是 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;}

任何人都可以向我解释为什么大多数人选择最后一种类型,这是怎么回事以及灵 active 有何帮助。谢谢?

最佳答案

  1. 如果您在强类型 TDocument 类(集合中的项目类型)中有一个名为 Id、id 或 _id 的列,则名为 "_id" 将在 Mongo 中生成。它还将为该列创建一个索引。如果尝试插入一个键已经存在的项目,您会得到一个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; }

如果未指定,将使用每种类型的默认值作为索引列。

  1. [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] 装饰不会成为索引列。

  1. [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; }

会很好的。

关于c# - 使用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38871416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com