我有一个应用程序,它有两个相似但不同的对象,我想将这些对象存储在同一个集合中。做这个的最好方式是什么?我该如何查询这个集合?
今天我的收藏有:
public IMongoCollection<Post> Posts
{
get
{
return _database.GetCollection<Post>("posts");
}
}
我有这个类(class):
public class Post
{
public string Id { get; set; }
public string Message { get; set; }
}
public class NewTypePost
{
public string Id { get; set; }
public string Image { get; set; }
}
所以,今天我只能使用 Post 类进行保存和查询。现在我想存储和检索这两个类,Post 和 NewTypePost。
我试图将类类型从 Post 更改为动态。但是当我这样做时,我无法查询集合。
最佳答案
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; }
}
Bson文档
您也可以放弃强类型方法并使用 BsonDocument
类,它是代表您的 Mongo 文档的动态字典式结构
var collection = db.GetCollection<BsonDocument>("posts");
更多详情 here
动态
将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
关于c# - 动态的 Mongodb 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55386687/