Mongodb集合充满活力

问题描述 投票:1回答:2

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

今天我的收藏品代表如下:

public IMongoCollection<Post> Posts
{
    get
    {
        return _database.GetCollection<Post>("posts");
    }
}

我有这堂课:

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更改为dynamic。但是当我这样做时,我无法查询集合。

c# mongodb mongodb-.net-driver
2个回答
1
投票

假设我有一个测试数据库的下一个conn:

var mongoClient = new MongoClient(new MongoClientSettings
{
    Server = new MongoServerAddress("localhost"),
});
var database = mongoClient.GetDatabase("TestDb");

然后我可以这样做:

var col = database.GetCollection<Post>("posts");
var col2 = database.GetCollection<NewTypePost>("posts");

获取IMongoCollection的两个不同实例,但指向数据库中的相同集合。此外,我能够以通常的方式保存到每个集合:

col.InsertOne(new Post { Message = "m1" });
col2.InsertOne(new NewTypePost { Image = "im1" });

然后,我还可以从这些集合中查询特定字段:

var p1= col.Find(Builders<Post>.Filter.Eq(x=>x.Message, "m1")).FirstOrDefault();
var p2 =col2.Find(Builders<NewTypePost>.Filter.Eq(x=>x.Image, "im1")).FirstOrDefault();

Console.WriteLine(p1?.Message); // m1
Console.WriteLine(p2?.Image);  // im1

我不知道这是不是你想要的,但它使用相同的集合。顺便说一句,更改要用[BsonId, BsonRepresentation(BsonType.ObjectId)]装饰的Id属性。希望能帮助到你。


1
投票

MongoDB .NET驱动程序在这种情况下提供了新的可能性:

Polymorphism

您可以构建类的层次结构,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

Single Class

您仍然可以使用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类,它是代表Mongo文档的动态字典结构

var collection = db.GetCollection<BsonDocument>("posts");

更多细节here

dynamic

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
© www.soinside.com 2019 - 2024. All rights reserved.