当我使用聚合排序时,我得到了mongo错误exceeded memory limit,错误代码为16819。我用mongo 2.6.查询如下:
exceeded memory limit
16819
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([ { "$project" : { "visitor_localdate" : 1 , "_id" : 0}}, { "$sort" : { "visitor_localdate" : -1}} ])
fwzugrvs1#
默认情况下,MongoDB中的聚合发生在内存中,管道阶段的RAM限制为100 Mb。看起来您已经超过了此阈值。要处理大型数据集,您应该启用聚合管道阶段,以便将数据写入临时文件。请使用allowDiskUse选项:
allowDiskUse
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.aggregate([ { "$project" : { "visitor_localdate" : 1 , "_id" : 0}}, { "$sort" : { "visitor_localdate" : -1}} ], { "allowDiskUse" : true })
ryoqjall2#
如果您正在使用聚合查询,请在排序所依据的字段上放置索引,然后使用排序运算符。
**注意:**请将排序运算符放在管道的开头或$project、$wunder和$group聚合运算符之前。如果$project、$wunder或$group在$sort运算之前发生,则$sort不能使用任何索引。[https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]
m1m5dgzv3#
在聚合管道之后使用{ allowDiskUse: true },如下所示:
{ allowDiskUse: true }
db.collectionOrView.aggregate([], { allowDiskUse: true });
9q78igpj4#
您根本不需要对此进行聚合。
db.BASE_TABLE_CREATION_ExecuteHiveScript_26_V0.find({}, { "_id" : 0, "visitor_localdate" : 1 }).sort({ "visitor_localdate" : -1 })
并在visitor_localdate上放置一个索引。这比聚合更简单、更快。
visitor_localdate
suzh9iv85#
要修复此问题,请在查询中启用allowDiskUse选项:该解决方案参考:内存限制在MongoDB中,in-sort的最大内存限制是100 M,如果执行更大的排序,则需要使用allowDiskUse选项将数据写入临时文件以进行排序。将allowDiskUse选项添加到查询中:
db.bigdata.aggregate( [ {$group : {_id : "$range", total : { $sum : 1 }}}, {$sort : {total : -1}} ], {allowDiskUse: true} );
aoyhnmkz6#
在我的scenerio中,我通过为排序列添加索引来修复它
mo49yndu7#
对于那些寻找答案pymongo并获取 * 属性错误:'dict'对象没有'_txn_read_preference'属性 *
此方法有效:
db.coll.aggregate([], allowDiskUse=True)
xlpyo6sf8#
Mongoose
await Model.aggregate([{ $match: { foo: 'bar' } }]).allowDiskUse(true);
来自https://mongoosejs.com/docs/api.html#query_Query-allowDiskUse
xmq68pz99#
对我来说,有几个因素在起作用:1.正如前面所述,我使用{ allowDiskUse: true }进行typeorm聚合1.我必须将{ $sort: {} }放在聚合之前。[{ $sort: {} }, ...aggregation]终于成功了!
{ $sort: {} }
[{ $sort: {} }, ...aggregation]
9条答案
按热度按时间fwzugrvs1#
默认情况下,MongoDB中的聚合发生在内存中,管道阶段的RAM限制为100 Mb。看起来您已经超过了此阈值。要处理大型数据集,您应该启用聚合管道阶段,以便将数据写入临时文件。请使用
allowDiskUse
选项:ryoqjall2#
如果您正在使用聚合查询,请在排序所依据的字段上放置索引,然后使用排序运算符。
**注意:**请将排序运算符放在管道的开头或$project、$wunder和$group聚合运算符之前。如果$project、$wunder或$group在$sort运算之前发生,则$sort不能使用任何索引。[https://docs.mongodb.com/manual/reference/operator/aggregation/sort/][1]
m1m5dgzv3#
在聚合管道之后使用
{ allowDiskUse: true }
,如下所示:9q78igpj4#
您根本不需要对此进行聚合。
并在
visitor_localdate
上放置一个索引。这比聚合更简单、更快。suzh9iv85#
要修复此问题,请在查询中启用allowDiskUse选项:
该解决方案
参考:内存限制
在MongoDB中,in-sort的最大内存限制是100 M,如果执行更大的排序,则需要使用allowDiskUse选项将数据写入临时文件以进行排序。
将allowDiskUse选项添加到查询中:
aoyhnmkz6#
在我的scenerio中,我通过为排序列添加索引来修复它
mo49yndu7#
对于那些寻找答案pymongo
并获取 * 属性错误:'dict'对象没有'_txn_read_preference'属性 *
此方法有效:
xlpyo6sf8#
Mongoose
来自https://mongoosejs.com/docs/api.html#query_Query-allowDiskUse
xmq68pz99#
对我来说,有几个因素在起作用:
1.正如前面所述,我使用
{ allowDiskUse: true }
进行typeorm聚合1.我必须将
{ $sort: {} }
放在聚合之前。[{ $sort: {} }, ...aggregation]
终于成功了!