这两天在工作中被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存储集合的一些问题的更多相关文章

  1. MongoDB 存储引擎:WiredTiger和In-Memory

    存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引 ...

  2. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  3. 了解mongoDB存储结构

    mongoDB 深入浅出一 了解mongoDB存储结构   MongoDB 深入浅出 数据逻辑结构 1 mongoDB中的文档(document) 相当于 关系性数据库的一条一条的记录 2 colle ...

  4. Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程

    Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...

  5. 使用 MongoDB 存储日志数据

    使用 MongoDB 存储日志数据     线上运行的服务会产生大量的运行及访问日志,日志里会包含一些错误.警告.及用户行为等信息.通常服务会以文本的形式记录日志信息,这样可读性强,方便于日常定位问题 ...

  6. MongoDB存储引擎选择

    MongoDB存储引擎选择 MongoDB存储引擎构架 插件式存储引擎, MongoDB 3.0引入了插件式存储引擎API,为第三方的存储引擎厂商加入MongoDB提供了方便,这一变化无疑参考了MyS ...

  7. mongodb存储引擎

    存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引 ...

  8. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  9. 使用 MongoDB 存储商品分类信息

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 这是一篇MongoDB官网上的一篇文章,分析了使用MongoDB存储商品分类信息相比其他数据库的优势,并讲述 ...

随机推荐

  1. NSData 与 struct 以及XML的转换。

    在做OC与C++ 混编的时候,我们可能会用到struct 与NSData的相互转换.在这里做一个记录 1.struct转换为NSData 例如如下的struct: struct tagPackageH ...

  2. lua c函数注册器

    lua与c的交互 关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数.而这些都是通过lua stack来进行的. c调用lua 在c里面使用lua,主要是通过l ...

  3. [Ext.Net]TreePanel 异步加载数据

    异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...

  4. (NO.00002)iOS游戏精灵战争雏形(一)

    原本想做一个复杂点的平面动作游戏,可以觉得还是有点把握不了.还是先从简单的原型开始吧. 构思中的精灵战争(SpriteWar)是一个类似FC时代的小游戏,可以造兵,可以捕获敌兵.原本还想加上保卫老巢的 ...

  5. [转]高级SQL注入:混淆和绕过

    ############# [0×00] – 简介[0×01] – 过滤规避(Mysql)[0x01a] – 绕过函数和关键词的过滤[0x01b] – 绕过正则表达式过滤[0×02] – 常见绕过技术 ...

  6. .NET(C#)连接各类数据库代码-集锦

    1.C#连接连接Access 复制代码代码如下: using System.Data;   using System.Data.OleDb;   ..   string strConnection=& ...

  7. Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  8. 增加AP INVOICE 行&分配行

    -- 增加行 DECLARE v_row_id VARCHAR2(1000); v_line_number number; g_user_id CONSTANT NUMBER := fnd_globa ...

  9. android:inputType常用取值

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  10. TCP连接建立系列 — TCP选项解析

    本文主要分析:在收到客户端的SYN包时,服务器端是如何解析它所携带的TCP选项,并结合本端情况决定是否予以支持. 内核版本:3.6 Author:zhangskd @ csdn blog 概述 收到客 ...