Разница между украшением свойства в C # с помощью BsonRepresentation (BsonType.ObjectId) против BsonId против ObjectId

Я новичок в mongodb, и мне нравится, как легко не беспокоиться о схемах, у меня вопрос, предположим, вы хотите использовать свойство Id в mongo и mongoObjectId чтобы обозначить свойства Id's, пока я вижу, вы можете иметь или украсить Id следующим образом,

public ObjectId Id {get; set;}

//or

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

//or

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

Может кто-нибудь объяснить мне, почему большинство людей выбирают последний тип, и что происходит и как помогает гибкость. Спасибо?

Ответы на вопрос(1)

Решение Вопроса

1) Если у вас есть столбец с именемId, id or _idпо твоему сильно набралTDocument класс (тип элемента в коллекции), затем столбец с именем"_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; } также будут индексные столбцы с использованием значений по умолчанию для каждого типа, если они не указаны.

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 внутренне.

Та же логика,public ObjectId SmthElseOtherThanId {get; set;} без[BsonId] украшение не будет столбцом индекса.

3)[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 сам будет автоматически генерировать идентификаторы объектов, однако вы сможете использовать строки в .net, фильтровать запросы и т. Д., Поскольку существует преобразование между идентификатором объекта и строкой.

имеющий[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; } будет просто отлично.

 Michael Ichangai13 авг. 2016 г., 14:31
Спасибо, любое ухудшение производительности испытано для преобразований типов, это заметно в масштабе.

Ваш ответ на вопрос