Mongodb-16Mb限制,在解除期间进行聚合

本文关键字:限制 Mongodb-16Mb | 更新日期: 2023-09-27 18:19:59

我有一个集合,要对它执行聚合。几周前,一切都很顺利,而且我添加了一些文档(使用相同的模式)。但是,当我尝试聚合我的集合时,我有引发的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.

展开后的目标是将校准中的预期项目与当前项目相匹配。

Mongodb-16Mb限制,在解除期间进行聚合

我相信只有当您向Mongo DB aggregate操作传递cursor:{}参数时,它才会返回游标。游标聚合选项在这里有文档说明。在这个线程中讨论了使用C#驱动程序处理聚合操作返回的游标

此外,如果您在第一阶段的意图是将聚合结果存储到另一个集合,则应使用{$out:[collection_name]}作为聚合管道中的最后一个阶段。$out运算符的mongodb文档可以在这里找到。这个操作符绕过了16MB文档大小的限制,因为它是一个数据库内操作,并由MongoDB进行相应的处理。