使用MongoDB存儲集合的一些問題

這兩天在工做中被Mongo集合存儲給整得頭大,固然也是個人認知太淺,因此下面我來分享下我所遇到的這個問題但願有大佬能給出更好的解決方案,前端

1.需求:

  存儲一個從前端接收未知數據類型的集合mongodb

     例:數據庫

           因爲是未知的數據類型,全部我建立了一個IList<Object>集合api

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只作了一件事,就是講接收到的數據進行存儲,spa

    而後咱們使用PostMan進行模擬請求測試3d

   能夠看到後臺如願的獲取到了請求數據,那麼存儲到Mongo中是什麼呢,咱們來看一下code

 

     能夠看到這個集合存儲到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); }

 

  上面代碼咱們就能夠將集合按照咱們所想那樣進行存儲,咱們來看一下效果

    上面方案我感受並很差,可是並無找到更好的方法,在此但願各位大佬能給出更好的解決方案

相關文章
相關標籤/搜索