Skip to main content
 首页 » 编程设计

c#之动态的 Mongodb 集合

2024年02月25日30bluestorm

我有一个应用程序,它有两个相似但不同的对象,我想将这些对象存储在同一个集合中。做这个的最好方式是什么?我该如何查询这个集合?

今天我的收藏有:

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