当要向数据库插入的数据 结构是动态(未知)的 且要默认追加特定列 可参考该教程
Eg:需要插入商品信息 具体字段需要根据输入数据 来决定 同时还要默认添加创建时间、主键索引id
我们有两种解决方法
- 类中包含 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"
}
}
- 使用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是同一级