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

简介: 这两天在工作中被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);
}

 

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

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

 

相关文章
|
存储 NoSQL 分布式数据库
Hbase+ES和MongoDB存储大数据的选用
Hbase+ES和MongoDB存储大数据的选用
837 0
|
存储 缓存 NoSQL
MongoDB内部的存储原理
这篇文章详细介绍了MongoDB的内部存储原理,包括存储引擎WiredTiger的架构、btree与b+tree的比较、cache机制、page结构、写操作流程、checkpoint和WAL日志,以及分布式存储的架构。
976 1
MongoDB内部的存储原理
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
390 1
|
存储 NoSQL MongoDB
数据的存储--MongoDB文档存储(二)
数据的存储--MongoDB文档存储(二)
304 2
|
9月前
|
NoSQL 关系型数据库 MongoDB
微服务——MongoDB常用命令——集合操作
本节主要介绍MongoDB中的集合操作,包括显式与隐式创建集合的方法。显式创建使用`db.createCollection(name)`,需遵循命名规范(如不能以&quot;system.&quot;开头或包含`\0`字符)。隐式创建则通过直接向不存在的集合插入文档实现,更为常用。此外,还介绍了集合删除方法`db.collection.drop()`及其返回值规则,帮助用户管理数据库中的集合资源。
342 0
|
12月前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB逻辑存储结构
MongoDB的逻辑存储结构由数据库(Database)、集合(Collection)和文档(Document)组成,形成层次化数据模型。用户通过mongoshell或应用程序操作这些结构。视频讲解及结构图详见下文。
339 3
|
存储 NoSQL 关系型数据库
【赵渝强老师】MongoDB的存储结构
MongoDB 是一个可移植的 NoSQL 数据库,支持跨平台运行。其逻辑存储结构包括数据库、集合和文档,而物理存储结构则由命名空间文件、数据文件和日志文件组成。视频讲解和示意图进一步解释了这些概念。
403 5
|
缓存 NoSQL MongoDB
|
存储 NoSQL MongoDB
MongoDB 创建集合
10月更文挑战第13天
238 1
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
612 3

推荐镜像

更多