C#/.Net MongoDB 动态静态数据混合使用

当要向数据库插入的数据 结构是动态(未知)的 且要默认追加特定列 可参考该教程

Eg:需要插入商品信息 具体字段需要根据输入数据 来决定 同时还要默认添加创建时间、主键索引id
我们有两种解决方法

  1. 类中包含 BsonDocument 作为属性 创建类如下
public class Post
{
    public ObjectId Id { get; set; }
  
    public DateTime CreatedAtUtc { get; set; }
   
    public BsonDocument Metadata { get; set; } //动态结构数据
}

可将所有动态数据 存储在Metadata 属性中 创建实例如下[id是默认自动生成的 具体可参见 https://www.cnblogs.com/Alicia-meng/p/16613701.html]

var post = new Post
{
    CreatedAtUtc = DateTime.UtcNow,
    Metadata = new BsonDocument("rel", "mongodb")
};

最终数据库存储结构为

{
    "_id" : ObjectId("5564b6c11de315e733f173cf"),
    "CreatedAtUtc" : ISODate("2015-05-26T18:09:05.883Z"),
    "Metadata": {
        "rel": "mongodb"   
    }
}
  1. 使用Base库中的标签元素 [BsonExtraElements]标注 创建类如下
public class Post
{
    public ObjectId Id { get; set; }
  
    public DateTime CreatedAtUtc { get; set; }
 
    [BsonExtraElements]
    public BsonDocument Metadata { get; set; }
}

同样将动态结构数据 存储在属性Metadata中 实例化如下

var post = new Post
{
    CreatedAtUtc = DateTime.UtcNow,
    Metadata = new BsonDocument("rel", "mongodb")
};

最终得到数据库结构

{
    "_id" : ObjectId("5564b6c11de315e733f173cf"),
    "CreatedAtUtc" : ISODate("2015-05-26T18:09:05.883Z"),
    "rel": "mongodb"   
}
两种方法实例化看着是一样的 但最终存储结构不同
  • 不使用 [BsonExtraElements]标签 数据库最终 将所有动态数据 作为同一个字段存储 存于Metadata下

  • 使用标签 则将Metadata 下的所有数据分别存储 且更id是同一级

posted @ 2022-08-30 11:27  C余L小R鱼  阅读(158)  评论(0编辑  收藏  举报