2014-01-13 39 views
1

enter image description hereMongoCollection.Update()使用C#<T>

我使用MongoVue應用程序顯示存儲在 「MongoDB的」 數據預覽更新列表。

在附圖中,數據庫名稱「Energy」具有集合名稱「DataLog」。在「DataLog」中,有幾行。我將這些行從.CSV文件中讀取到集合中。

現在有時列名的Ping具有巨大的數據[說的2000項陣列用於單個行由於其即,如果「MaxDocumentSize超過16MB」

由於的Ping陣列是巨大的,其拋出異常發生一個例外,爲了避免這種情況,我刪除了Pings [即從行中輸入空白收集]並嘗試插入,它成功了。

現在我想更新相同條目的Pings,但是如果數組是2000元素或更高的數組,那麼我希望在循環中以500個項目[500 x 4 = 2000]的組進行更新。

任何人都可以幫助我。

**樣品編號**

private void InsertData(Datalog xiDatalog) 
    { 
       List<Ping> tempPings = new List<Ping>(); 
       tempPings.AddRange(xiDatalog.Pings); 
       xiDatalog.Pings.RemoveAll(x => x.RowId != 0); 
       WriteConcernResult wc = mongoCollection.Insert(xiDatalog); 
       counter++; 


       var query = new QueryDocument("_id", xiDatalog.Id); 
       MongoCursor<Datalog> cursor = mongoCollection.FindAs<Datalog>(query); 

       foreach (Datalog data in cursor) 
       { 
        AddPings(data, tempPings, mongoCollection); 
        break; 
       } 

    } 

    private void AddPings(Datalog xiDatalog, List<Ping> xiPings, MongoCollection<Datalog> mongoCollection) 
    { 
     int groupCnt = 0; 
     int insertCnt = 0; 
     foreach (Ping px in xiPings) 
     { 
      xiDatalog.Pings.Add(px); 
      groupCnt++; 

      if (((int)(groupCnt/500)) > insertCnt) 
      { 
       UpdateDataLog(xiDatalog.Id, xiDatalog.Pings, mongoCollection); 
       insertCnt++; 
      } 
     } 
    } 

    private bool UpdateDataLog(BsonValue Id, List<Ping> tempPings, MongoCollection<Datalog> mongoCollection) 
    { 
     bool success = false; 

     try 
     { 
      var query = new QueryDocument("_id", Id); 
      var update = Update<Datalog>.Set(e => e.Pings, tempPings); 
      mongoCollection.Update(query, update); 
      success = true; 
     } 
     catch (Exception ex) 
     { 
      string error = ex.Message; 
     } 

     return success; 
    } 
+2

文檔總大小不能超過16mb。你似乎試圖插入相同數量的數據,只是以塊爲單位?如果您添加了您嘗試過的代碼,這將更加清晰。 – WiredPrairie

+1

您是否考慮過將Pings放入不同的系列? –

+0

**添加示例代碼,請參閱** –

回答

0

答:只要修改爲使用Update.PushAll()代替Update.Set()

的代碼,請參考下面的代碼

private bool UpdateDataLog(BsonValue Id, List<Ping> tempPings, MongoCollection<Datalog> mongoCollection) 
{ 
    bool success = false; 

    try 
    { 
     var query = new QueryDocument("_id", Id); 
     var update = Update<Datalog>.PushAll(e => e.Pings, tempPings); 
     mongoCollection.Update(query, update); 
     success = true; 
    } 
    catch (Exception ex) 
    { 
     string error = ex.Message; 
    } 

    return success; 
}