Драйвер MongoDB .NET предлагает несколько вариантов в таких случаях:
Полиморфизм
Вы можете построить иерархию классов, и драйвер MongoDB сможет определить тип объекта, который он получает из базы данных:
[BsonKnownTypes(typeof(Post), typeof(NewTypePost))]
public abstract class PostBase
{
[BsonId]
public string Id { get; set; }
}
public class Post: PostBase
{
public string Message { get; set; }
}
public class NewTypePost: PostBase
{
public string Image { get; set; }
}
Драйвер MongoDB создаст дополнительное поле _t
в каждом документе, которое будет представлять соответствующий класс.
Одноместный класс
Вы по-прежнему можете иметь класс Post
и использовать атрибут BsonIgnoreIfNull
, чтобы избежать исключения сериализации. Драйвер MongoDB .NET установит эти свойства на null
, если они не существуют в вашей базе данных.
public class Post
{
[BsonId]
public string Id { get; set; }
[BsonIgnoreIfNull]
public string Message { get; set; }
[BsonIgnoreIfNull]
public string Image { get; set; }
}
BsonDocument
Вы также можете отказаться от строго типизированного подхода и использовать BsonDocument
класс, который представляет собой динамическую словарную структуру, представляющую ваши монго-документы
var collection = db.GetCollection<BsonDocument>("posts");
Подробнее здесь
динамический
Указав dynamic
в качестве общего параметра ICollection
, вы должны получить список ExpandoObject , в котором будут храниться все значения, имеющиеся в вашей базе данных.
var collection = db.GetCollection<dynamic>("posts");
var data = collection.Find(Builders<dynamic>.Filter.Empty).ToList();
var firstMessage = data[0].Message; // dynamically typed code