当我使用聚合排序时,我收到错误代码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}}
])
答案 0 :(得分:6)
默认情况下,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 })
答案 1 :(得分:2)
如果您使用的是聚合查询。请在要排序的字段上放置一个索引,然后使用sort运算符。
注意: 将排序运算符放在管道的开头或$ project,$ unwind和$ group聚合运算符之前。如果$ project,$ unwind或$ group在$ sort操作之前发生,则$ sort不能使用任何索引。 [https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]
答案 2 :(得分:2)
要修复它,请在查询中启用 allowDiskUse 选项:
解决办法
参考:内存限制
在 MongoDB 中,in-sort 的最大内存限制是 100M,如果执行更大的排序,则需要使用 allowDiskUse 选项将数据写入临时文件进行排序。
在查询中添加 allowDiskUse 选项:
db.bigdata.aggregate(
[
{$group : {_id : "$range", total : { $sum : 1 }}},
{$sort : {total : -1}}
],
{allowDiskUse: true}
);
答案 3 :(得分:1)
根本不需要聚合。使用查询
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })
并在visitor_localdate
上添加索引。这比聚合更简单,更快。
答案 4 :(得分:0)
在聚合管道之后使用{ allowDiskUse: true }
,如下所示:
db.collectionOrView.aggregate([], { allowDiskUse: true });