我有一个我想要执行聚合的集合 . 几周前,一切都运行得很好,因为我添加了一些文档(使用相同的模式) . 但是,当我尝试聚合我的集合时,我有一个抛出的BSON文档异常的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.
展开后的目标是将校准中的预期项目与当前项目相匹配 .
1 回答
我相信只有在向它传递
cursor:{}
参数时,Mongo DB agggregate操作才会返回游标 . 记录了游标聚合选项here.使用C#驱动程序处理聚合操作返回的游标将在this thread中讨论此外,如果您在第一阶段的意图是将聚合结果存储到另一个集合,则应使用
{$out:[collection_name]}
作为聚合管道中的最后一个阶段 . 可以找到$ out运算符的mongodb文档here.此运算符可以绕过16MB的文档大小限制,因为它是一个数据库内操作,并由Mongo DB进行相应处理 .