c# - 动态的 Mongodb 集合

标签 c# mongodb mongodb-.net-driver

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

今天我的收藏有:

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/

相关文章:

asp.net - 如何使用 ASP.NET Core 更新 mongo Db 集合中的嵌套 JSON 对象字段

java - 使用自定义 _id 值

c# - 更新 MongoDB 中嵌套实体数组中的属性

c# - MongoDB C# 查询表达式(如何?)

c# - RSA SHA256 签名生成和验证

c# - 错误 : VS2017 Live Unit Testing - only minus's - doesn't work

c# - Unity依赖注入(inject)解决返回System.NullReferenceException

c# - Visual Studio 附加到进程并在中断时查看代码?

mongodb - 如何清除 mongo shell 中的命令历史记录

c# - 不能对 mongodb 集合做 asqueryable