我通过查询获得exceeds maximum document size problem
异常,如下所示,
pipe = [
{"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }}
]
res =db.patients.aggregate(pipe,allowDiskUse=True)
我通过添加$project
运算符
但是,如果文档仍在16MB
上,即使我使用$project
?
我该怎么办?任何的想法 ?谢谢
pipe = [
{"$project": {"birthday":1, "id":1}
},
{"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }
}
]
res =db.patients.aggregate(pipe,allowDiskUse=True)
OperationFailure: command SON([('aggregate', 'patients'), ('pipeline', [{'$match': {'birthday': {'$gte': datetime.datetime(1987, 1, 1, 0, 0)}}}]), ('allowDiskUse', True)]) on namespace tw_insurance_security_development.$cmd failed: exception: aggregation result exceeds maximum document size (16MB)
答案 0 :(得分:28)
默认情况下,聚合的结果将在单个BSON文档中返回给您,这是大小限制的来源。如果您需要返回更多,您可以:
将结果输出到集合。您可以通过
完成管道来完成此操作{" $ out":" some-collection-name"}
然后您正常查询该集合(当您完成此操作时,您需要自行删除它)
通过在调用聚合时指定useCursor=True
,将结果作为游标返回。
这两个选项都需要mongodb 2.6:如果你仍在运行mongodb 2.4,那么这只是聚合的基本限制。
答案 1 :(得分:4)
正如@Frederick所说至少要求mongo 2.6,为了进一步参考,here是来自mongo文档的链接,其工作方式类似于runCommand方式,但是使用db.collection.aggreagate,请注意,对于文档限制使用“ cursor“选项,用于排序限制使用”allowDiskUse“选项。
答案 2 :(得分:0)
您可以使用 aggregateCursor(collection_name, $pipeLine, ["useCursor" => true])
。
pipe = [
{"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }}
]
res =db.patients.aggregateCursor(collection_name, pipe, ["useCursor" => true]);
$ret = [];
foreach ($taskList as $task){
array_push($ret, $task);
}
return $ret;
答案 3 :(得分:-5)
使用以下代码段
db.patients.runCommand('aggregate',
{pipeline: [
{"$project": {"birthday":1, "id":1}},
{"$match": { "birthday":{"$gte":datetime.datetime(1987, 1, 1, 0, 0)} }}
],
allowDiskUse: true})
这里allowDiskUse将有助于找出超过16 MB的数据