mongodb 使用聚合时出现Mongo错误:排序超出内存限制

xurqigkl  于 2022-11-03  发布在  Go
关注(0)|答案(9)|浏览(245)

当我使用聚合排序时,我得到了mongo错误exceeded memory limit,错误代码为16819
我用mongo 2.6.
查询如下:

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([
     { "$project" : { "visitor_localdate" : 1 , "_id" : 0}}, 
     { "$sort" : { "visitor_localdate" : -1}}
])
fwzugrvs

fwzugrvs1#

默认情况下,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 })
ryoqjall

ryoqjall2#

如果您正在使用聚合查询,请在排序所依据的字段上放置索引,然后使用排序运算符。

**注意:**请将排序运算符放在管道的开头或$project、$wunder和$group聚合运算符之前。如果$project、$wunder或$group在$sort运算之前发生,则$sort不能使用任何索引。[https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]

m1m5dgzv

m1m5dgzv3#

在聚合管道之后使用{ allowDiskUse: true },如下所示:

db.collectionOrView.aggregate([], { allowDiskUse: true });
9q78igpj

9q78igpj4#

您根本不需要对此进行聚合。

db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })

并在visitor_localdate上放置一个索引。这比聚合更简单、更快。

suzh9iv8

suzh9iv85#

要修复此问题,请在查询中启用allowDiskUse选项:
该解决方案
参考:内存限制
在MongoDB中,in-sort的最大内存限制是100 M,如果执行更大的排序,则需要使用allowDiskUse选项将数据写入临时文件以进行排序。
将allowDiskUse选项添加到查询中:

db.bigdata.aggregate(
[
 {$group : {_id : "$range", total : { $sum : 1 }}},
 {$sort : {total : -1}}
],
 {allowDiskUse: true}
);
aoyhnmkz

aoyhnmkz6#

在我的scenerio中,我通过为排序列添加索引来修复它

mo49yndu

mo49yndu7#

对于那些寻找答案pymongo
并获取 * 属性错误:'dict'对象没有'_txn_read_preference'属性 *

此方法有效:

db.coll.aggregate([], allowDiskUse=True)
xlpyo6sf

xlpyo6sf8#

Mongoose

await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);

来自https://mongoosejs.com/docs/api.html#query_Query-allowDiskUse

xmq68pz9

xmq68pz99#

对我来说,有几个因素在起作用:
1.正如前面所述,我使用{ allowDiskUse: true }进行typeorm聚合
1.我必须将{ $sort: {} }放在聚合之前。
[{ $sort: {} }, ...aggregation]
终于成功了!

相关问题