Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between decorating a property in C# with BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

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?

like image 693
Michael Mburu Avatar asked Aug 10 '16 10:08

Michael Mburu


1 Answers

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

will use the type generator for ObjectId and it will look like

_id: ObjectId("57ade20771e59f422cc652d9")

Likewise:

public Guid _id { get; set; }

will use the Guid generator to produce smth like

"_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==")

Also all of the following properties

public int Id { get; set; }
public string id { get; set; }
public byte[] _id { get; set; }

will be index columns using the defaults for each type if not specified.

  1. [BsonId] gives you the flexibility of naming that index any way you want.

These both will be indexes:

[BsonId] 
public Guid SmthElseOtherThanId { get; set; } 

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

However;

public Guid SmthElseOtherThanId { get; set; } 
public string StringId { get; set; }

won't be indexes, mongodb will still use _id internally.

Same logic,

public ObjectId SmthElseOtherThanId {get; set;}

with no [BsonId] decoration won't be an index column.

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

Having

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

is identical to:

public ObjectId Id { get; set; }

But,

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

is different. Mongo will auto generate object ids by itself, however you will be able to use strings in .net, filter queries etc., because there is a conversion between object id and string.

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.

But

[BsonId] 
[BsonRepresentation(BsonType.String)] 
public int StringId { get; set; }

will be just fine.

like image 53
andrei.ciprian Avatar answered Oct 15 '22 20:10

andrei.ciprian