acu*_*ube 4 mongodb aggregation-framework
当我使用聚合排序时,我得到exceeded memory limit错误代码的mongo错误16819.
我使用mongo 2.6.
查询如下:
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
{ "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
{ "$sort" : { "visitor_localdate" : -1}}
])
Run Code Online (Sandbox Code Playgroud)
Dev*_*han 16
{ allowDiskUse: true }在聚合管道之后使用,如下所示:
db.collectionOrView.aggregate([], { allowDiskUse: true });
Run Code Online (Sandbox Code Playgroud)
小智 14
如果您使用聚合查询。在您排序的字段上放置一个索引,然后使用排序运算符。
注意: 将排序运算符放在管道的开头或 $project、$unwind 和 $group 聚合运算符之前。如果 $project、$unwind 或 $group 在 $sort 操作之前发生,则 $sort 不能使用任何索引。[ https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]
Ser*_*kiy 10
默认情况下,MongoDB中的聚合发生在内存中,而管道阶段的RAM限制为100 Mb.看起来你已超过这个门槛.要处理大型数据集,您应启用聚合管道阶段以将数据写入临时文件.使用allowDiskUse选项:
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
{ "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
{ "$sort" : { "visitor_localdate" : -1}}
], { "allowDiskUse" : true })
Run Code Online (Sandbox Code Playgroud)
您根本不需要为此进行聚合。使用查询
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })
Run Code Online (Sandbox Code Playgroud)
并在 上建立索引visitor_localdate。这比聚合更简单、更快。
要修复此问题,请在查询中启用 allowedDiskUse 选项:
解决方案
参考:内存限制
在MongoDB中,in-sort的最大内存限制为100M,如果执行更大的排序,则需要使用allowDiskUse选项将数据写入临时文件中进行排序。
将allowDiskUse 选项添加到查询中:
db.bigdata.aggregate(
[
{$group : {_id : "$range", total : { $sum : 1 }}},
{$sort : {total : -1}}
],
{allowDiskUse: true}
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8119 次 |
| 最近记录: |