首页 > 数据库 >C#/.Net MongoDB 动态静态数据混合使用

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

时间:2022-08-30 11:35:47浏览次数:83  
标签:静态数据 set get C# MongoDB BsonDocument CreatedAtUtc public Metadata

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

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是同一级

标签:静态数据,set,get,C#,MongoDB,BsonDocument,CreatedAtUtc,public,Metadata
From: https://www.cnblogs.com/Alicia-meng/p/16638718.html

相关文章

  • VScode 控制台设置
    VScode控制台设置大前提:VScode已下载CodeRunner插件1.调整打印结果位置VScode打印结果默认是在“终端”位置如果想将打印结果位置调整到“输出”位置步骤:VScod......
  • idea 编译 错误 Error:java: Compilation failed: internal java compiler error 解决
    手动修改(可能会被idea自动改回1.5)修改为对应的编译版本在工程的pom中添加如下配置<build><plugins><plugin><groupId>org.apache.maven.......
  • centos内网镜像挂载
    [root@localhost~]#挂载系统ISO镜像,配置yum源由于内网无法访问网络,所以需先挂载centos7的ISO镜像,然后配置yum源安装mysql5.6编译所需要的依赖包创建ISO镜像存放目录并上......
  • 【MindSpore易点通】如何将PyTorch源码转成MindSpore低阶APIP,并在Ascend芯片上实现单
    文章来源:华为云论坛_云计算论坛_开发者论坛_技术论坛-华为云1 概述本文将介绍如何将PyTorch源码转换成MindSpore低阶API代码,并在Ascend芯片上实现单机单卡训练。下图展......
  • 并发编程五、CAS与AQS原理及源码分析
    前言:文章内容:线程与进程、线程生命周期、线程中断、线程常见问题总结本文章内容来源于笔者学习笔记,内容可能与相关书籍内容重合偏向于知识核心总结,非零基础学习文章,可......
  • join clause (C# Reference)
    joinclause(C#Reference)Thejoinclauseisusefulforassociatingelementsfromdifferentsourcesequencesthathavenodirectrelationshipintheobjectmo......
  • 阅读《计算机图形学编程(使用OpenGL和C++)》11 - 加载外部obj模型
    复杂的3D模型可以借助建模工具生成,这种工具能够在3D空间中构建任意形状并自动生成顶点、纹理坐标、顶点法向量等。模型生成后可导出成obj文件格式,这种格式有很多,OBJ文件很......
  • C#集合:字典
    字典是一种集合,其包含的元素均为键值对。字典通常用于查找或用作排序列表。框架通过IDictionary和IDictionary<TKey,TValue>接口以及一系列通用的字典类定义了标准字典协......
  • Oracle 服务名/实例名,Service_name 和Sid的区别
    Oracle服务名/实例名,Service_name和Sid的区别 Service_name和Sid的区别Service_name:该参数是由oracle8i引进的。在8i以前,使用SID来表示标识数据库的一个实例,但是在......
  • vue3+vuex 的 actions 的 使用
    <template><divclass="app">姓名:{{$store.state.nameVuex}}<button@click="btn">基本方法:修改名字</button><br/><button@click="btn1">传递值......