用BsonRepresentation(BsonType.ObjectId),BsonId和ObjectId装饰C#中的属性之间的区别 [英] Difference between decorating a property in C# with BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

查看:172
本文介绍了用BsonRepresentation(BsonType.ObjectId),BsonId和ObjectId装饰C#中的属性之间的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是mongodb的新手,并且喜欢不担心架构问题有多么容易,我有一个问题,假设您想在mongo中使用Id属性,而mongo使用ObjectId来表示属性Id,到目前为止,我认为您可以拥有或装饰如下的ID,

Am new to mongodb and am liking how easy it is not to worry about schema stuff, I have a question suppose you want an Id property in mongo and mongo uses ObjectId to denote property Id's, so far i see you can have or decorate an Id as follows,

public ObjectId Id {get; set;}

//or

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

//or

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

谁能向我解释为什么大多数人选择最后一种类型,发生了什么,以及灵活性如何提供帮助.谢谢吗?

Can anyone explain to me why most people choose the last type, and whats going on and how the flexibility helps. Thanks?

推荐答案

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

1) If you have a column named Id, id or _id, in your strongly typed TDocument class (the item type in a collection), then a column named "_id" will be generated in Mongo. It will also create an index for that column. You get a duplicate key error exception if trying to insert an item with a key that already exists.

public ObjectId Id { get; set; }将为ObjectId使用类型生成器,其外观类似于_id: ObjectId("57ade20771e59f422cc652d9").

public ObjectId Id { get; set; } will use the type generator for ObjectId and it will look like _id: ObjectId("57ade20771e59f422cc652d9").

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

public Guid _id { get; set; } will use the Guid generator to produce smth like "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==").

public int Id { get; set; }public string id { get; set; }public byte[] _id { get; set; }还将是使用每种类型默认值的索引列.

public int Id { get; set; }, public string id { get; set; }, public byte[] _id { get; set; } will also be index columns using the defaults for each type if not specified.

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.

2) [BsonId] gives you the flexibility of naming that index any way you want. [BsonId] public Guid SmthElseOtherThanId { get; set; } and [BsonId] public string StringId { get; set; } will be indexes; public Guid SmthElseOtherThanId { get; set; } and public string StringId { get; set; } won't. mongodb will still use _id internally.

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

Same logic, public ObjectId SmthElseOtherThanId {get; set;} with no [BsonId] decoration won't be an index column.

3)[BsonRepresentation]使您可以尝试使用Mongo类型与内部.Net类型(如果它们之间存在转换)进行修饰.

3) [BsonRepresentation] lets you juggle with the Mongo type vs the internal .Net type, if there's a conversion between them.

具有[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和字符串之间存在转换.

Having [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } is different however. Mongo will auto generate object ids by himself, however you will be able to use strings in .net, filter queries etc., because there is a conversion between object id and string.

具有[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消息.

Having [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } or [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } will fail with a ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer message.

但是[BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; }就可以了.

这篇关于用BsonRepresentation(BsonType.ObjectId),BsonId和ObjectId装饰C#中的属性之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆