使用MongoDB存储集合的一些问题

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 这两天在工作中被Mongo集合存储给整得头大,当然也是我的认知太浅,所以下面我来分享下我所遇到的这个问题希望有大佬能给出更好的解决方案,1.需求:  存储一个从前端接收未知数据类型的集合     例:           由于是未知的数据类型,所有我创建了一个IList集合public ...

这两天在工作中被Mongo集合存储给整得头大,当然也是我的认知太浅,所以下面我来分享下我所遇到的这个问题希望有大佬能给出更好的解决方案,

1.需求:

  存储一个从前端接收未知数据类型的集合

     例:

           由于是未知的数据类型,所有我创建了一个IList<Object>集合

public class Demo
{
        public String Name { get; set; }
        public List<Object> List { get; set; }
}

2.问题

  按照我们平常的想法我们只要将数据从api接收到并且进行存储即可,那么事实真是如此吗,下面我们来进行一个简单的测试

  首先创建api

[RoutePrefix("Home")]
    public class HomeController : ApiController
    {
        public HomeController() { }
        //连接地址
        private static string conn = "mongodb://192.168.11.51:40000";
        //数据库名称
        private static string dbName = "yan";
        //集合名称
        private static string colName = "Demo";
        static MongoClient client = new MongoClient(conn);
        //获取指定数据库
        static IMongoDatabase db = client.GetDatabase(dbName);
        //获取指定集合   BsonDocument数据库文档对象
        static IMongoCollection<Demo> coll = db.GetCollection<Demo>(colName);
        [HttpPost]
        [Route("TestMongo")]
        public void TestMongo([FromBody] Demo demo)
        {
            coll.InsertOne(demo);
        }
    }

    从上面可以看出我们在TestMongo只做了一件事,就是讲接收到的数据进行存储,

    然后我们使用PostMan进行模拟请求测试

   可以看到后台如愿的获取到了请求数据,那么存储到Mongo中是什么呢,我们来看一下

 

     可以看到这个集合存储到Mongo中变成了一组我们几乎看不懂的数据结构,那么这到底是怎么回事,下面我解析下我猜想的跟其解决方法。

  3.解决方案

    首先我们来获取解析下从客户端接收到的集合类型

    我们可以看到集合中存储的每一个类型是JObject类型,而展开这个类型时发现里面数据结构好像根本无法解析所以导致我们在存储时并没有按照我们所想的那样进行存储,那么该怎么进行解决呢,整了两天整出了一个不算好的解决方案,

     首先将集合改成IEnumberable<Object>类型(后面解释其原因)

public class Demo
{
        public String Name { get; set; }
        public IEnumerable<Object> List { get; set; }
}

    然后在api中做一些特殊处理

 public void TestMongo([FromBody] Demo demo)
{
            //1.将集合包装成一个Object集合序列化
            String strVal = JsonConvert.SerializeObject(new { data = demo.List });
            //2.将序列化的字符串转换成BsonDocument类型
            BsonDocument doc = BsonDocument.Parse(strVal);
            //3.使用BsonDocument获取被包装的集合并转换成BsonArray类型
            var docArr = doc.GetValue("data").AsBsonArray;
            //4.获取BsonArray的Values值并重写赋给原集合引用
            //【因为Values值是IEnumerable<BsonValue>类型,所以原集合必须是IEnumerable<Object>类型】
            demo.List = doc.Values;


            coll.InsertOne(demo);
}

 

  上面代码我们就可以将集合按照我们所想那样进行存储,我们来看一下效果

    上面方案我感觉并不好,但是并没有找到更好的方法,在此希望各位大佬能给出更好的解决方案

 

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
存储 NoSQL 分布式数据库
Hbase+ES和MongoDB存储大数据的选用
Hbase+ES和MongoDB存储大数据的选用
417 0
|
2月前
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
32 1
|
3月前
|
存储 缓存 NoSQL
MongoDB内部的存储原理
这篇文章详细介绍了MongoDB的内部存储原理,包括存储引擎WiredTiger的架构、btree与b+tree的比较、cache机制、page结构、写操作流程、checkpoint和WAL日志,以及分布式存储的架构。
99 1
MongoDB内部的存储原理
|
2月前
|
存储 NoSQL MongoDB
数据的存储--MongoDB文档存储(二)
数据的存储--MongoDB文档存储(二)
62 2
|
27天前
|
存储 NoSQL 关系型数据库
【赵渝强老师】MongoDB的存储结构
MongoDB 是一个可移植的 NoSQL 数据库,支持跨平台运行。其逻辑存储结构包括数据库、集合和文档,而物理存储结构则由命名空间文件、数据文件和日志文件组成。视频讲解和示意图进一步解释了这些概念。
|
1月前
|
缓存 NoSQL MongoDB
|
2月前
|
存储 NoSQL MongoDB
MongoDB 创建集合
10月更文挑战第13天
34 1
|
2月前
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
77 3
|
4月前
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
186 0
|
6月前
|
存储 JSON NoSQL
深入解析MongoDB的存储原理
深入解析MongoDB的存储原理
深入解析MongoDB的存储原理