2014-08-29 58 views
0

我有我想要執行聚合的集合。幾周前,一切都很完美,並且因爲我添加了一些文檔(具有相同的模式)。但是,當我嘗試彙總我的收藏時,我有16Mb的BSON文檔異常被引發限制。Mongodb - 16Mb限制與展開期間的聚合

最令人驚訝的是,我試圖確定何時在聚合中達到限制,並且在第一步達到限制時,我只是簡單地展開部分文檔。

我的問題是,如何存儲的文件(這是大小小於16Mb的性質)可以成爲超過16Mb後展開?請注意,當我嘗試使用InsertBatch方法將結果光標插入另一個集合時,會引發異常。我也嘗試枚舉遊標,但我有相同的異常,如果我嘗試訪問第一個文檔相同。

[編輯]:我使用的MongoDB版本2.6.1和C#驅動程序的版本1.9.2

[編輯]:我使用的文件類似於

{ 
    "_id" : ObjectId("53ff90e8dcb48a09f090f291"), 
    "Val1" : 10 
    "Val2" : true, 
    "Mesure" : { 
     "_id" : ObjectId("53ff90e8dcb48a09f090f284"), 
     "Calibration" : { 
      "CalibrationDate" : ISODate("2014-08-28T16:29:59.335-04:00"), 
      "Expected" : [ 
       { 
        "Bin" : 12, 
        "PositionCalibrated" : 0, 
        "PositionExpected" : 0, 
        "PositionMax" : 0, 
        "PositionMin" : 0, 
        "PositionStd" : 0, 
        "PositionTab" : [ 
         0, 
         0, 
         0 
        ], 
        "PositionTolerance" : 1 
       }, 
       { 
        "Bin" : 11, 
        "PositionCalibrated" : 406.113044449032, 
        "PositionExpected" : 401.1, 
        "PositionMax" : 406.113044449032, 
        "PositionMin" : 406.113044449032, 
        "PositionStd" : 5.684341886080802e-014, 
        "PositionTab" : [ 
         406.113044449032, 
         406.113044449032, 
         406.113044449032 
        ], 
        "PositionTolerance" : 1 
       }, 
       { 
        "Bin" : 7, 
        "PositionCalibrated" : 454.9231746931026, 
        "PositionExpected" : 431.1, 
        "PositionMax" : 454.9231746931027, 
        "PositionMin" : 454.9231746931027, 
        "PositionStd" : 5.684341886080802e-014, 
        "PositionTab" : [ 
         454.9231746931027, 
         454.9231746931027, 
         454.9231746931027 
        ], 
        "PositionTolerance" : 1 
       } 
      ], 
      "_id" : ObjectId("53ff9143dcb48a09f090f2ae") 
     } 
    }, 
    "PositionMeasured" : 407.23645821 
} 

我使用C#驅動程序的聚合管道。我想要做幾個聚合步驟(展開,排序,組合,項目等),但第一步是展開這些元素。使用的代碼如下:

var UnwindCalib = new BsonDocument("$unwind", "$Mesure.Calibration.Expected"); 
var pipeline = new[] { UnwindCalib }; 
var args = new AggregateArgs(); 
args.Pipeline = pipeline; 
args.AllowDiskUse = true; 
var result = myCollection.Aggregate(args); 
resultsCollection.InsertBatch(result); <----- I've got an error here. 

展開後的目標是使校準中的預期項目與當前項目匹配。

+0

要計算展開後的輸出大小,可以將其近似爲單個文檔大小*展開數組中的元素總數。 – displayName 2014-08-29 02:29:15

+0

你使用什麼聚合查詢?它不是簡單地展開多個文件? – Kenneth 2014-08-29 06:48:32

+1

請包括管道和您如何知道哪個管道階段導致問題的描述。 – wdberkeley 2014-08-29 07:56:55

回答

2

我相信只有當你傳遞一個cursor:{}的參數時,Mongo DB的聚集操作纔會返回遊標。該光標聚集選項記錄here.通過使用C#的司機聚集操作返回遊標在this thread

也是討論的,如果你打算在第一個階段是聚集結果存儲到另外一個集合,你應該使用{$out:[collection_name]}作爲聚合管道中的最後一個階段。 $ out運算符的mongodb文檔可以找到here.此運算符規避了16MB文檔大小限制,因爲它是一個in-DB操作,並且由Mongo DB進行相應處理。

+0

我知道,但我不知道如何做與C#驅動程序相同...還沒有找到它,實際上$ out選項不適用於當前版本的驅動程序。對於遊標1,我不知道 – GuillaumeA 2014-08-29 17:36:28

+0

嗯,我的錯,$ out aggregation命令現在可以從驅動程序的版本1.9開始使用(請參閱https://jira.mongodb.org/browse/CSHARP-800?jql=text% 20〜20%%22%24out%22)。 Mea cupla。 – GuillaumeA 2014-08-29 18:16:28

+0

@GuillaumeA我編輯了我的答案,提供了一個討論在C#中使用聚合遊標的線程。答案是解決你的問題......你只是沒有指出你已經考慮過的選項。因此,我不同意反對票。 – AxxE 2014-08-29 21:28:42