当我使用聚合排序时,我遇到了mongo错误超出内存限制
,错误代码为16819
。
我正在使用mongo 2.6版本。
查询如下:
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
{ "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
{ "$sort" : { "visitor_localdate" : -1}}
])
当我使用聚合排序时,我遇到了mongo错误超出内存限制
,错误代码为16819
。
我正在使用mongo 2.6版本。
查询如下:
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
{ "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
{ "$sort" : { "visitor_localdate" : -1}}
])
默认情况下,MongoDB中的聚合是在内存中进行的,并且管道阶段的内存限制为100 Mb。看起来您已经超过了此阈值。为了处理大型数据集,您应该启用聚合管道阶段将数据写入临时文件。使用 allowDiskUse
选项:
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
{ "$project" : { "visitor_localdate" : 1 , "_id" : 0}},
{ "$sort" : { "visitor_localdate" : -1}}
], { "allowDiskUse" : true })
https://docs.mongodb.com/manual/reference/operator/aggregation/sort
allowDiskUse
只是一个解决方法。 - Vincz777在聚合管道后使用 { allowDiskUse: true }
,如下所示:
db.collectionOrView.aggregate([], { allowDiskUse: true });
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })
并在 visitor_localdate
上建立索引。这比聚合更简单、更快速。
db.bigdata.aggregate(
[
{$group : {_id : "$range", total : { $sum : 1 }}},
{$sort : {total : -1}}
],
{allowDiskUse: true}
);
对于Mongoose
await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);
来源:https://mongoosejs.com/docs/api.html#query_Query-allowDiskUse
allowDiskUse()
如果查询需要使用磁盘,则允许MongoDB使用磁盘。当查询的数据量大于内存时,MongoDB会自动使用磁盘。
注意:如果您使用的是MongoDB版本2.6或更早版本,则不支持此选项。
对于那些寻找 pymongo 答案的人
并且出现 AttributeError: 'dict' object has no attribute '_txn_read_preference'
这个方法有效:
db.coll.aggregate([], allowDiskUse=True)
正如已经告诉过我一样,我在我的typeorm聚合中使用了 { allowDiskUse: true }
在聚合之前,我必须放置 { $sort: {} }
。
[{ $sort: {} }, ...aggregation]
16819
代码有非常清晰的解释注释和解决步骤:排序超出了内存限制字节,但没有选择外部排序。操作中止。传递allowDiskUse:true以选择加入。 - Sergey Berezovskiydb.BASE_TABLE.aggregate([]).allowDiskUse(true);
该代码用于允许在聚合查询中使用磁盘空间。 - kheengz