MongoDB allowedDiskUse 不起作用..

问题描述 投票:0回答:4

专家。

我是 MongoDB 新手,但了解得足够多,这会让我自己陷入麻烦.. 例子:

db.test.aggregate(
[
    {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
    {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
    {$match: {cnt: 2}}
], 
    {allowDiskUse : true}
)

无论我尝试什么变化,我都会收到相同的错误(“传递allowDiskUse:true以选择加入”):

错误(“打印堆栈跟踪”)@:0()@src/mongo/shell/utils.js:37 ([对象数组],[对象对象])@src/mongo/shell/collection.js:866 @(外壳):7

未捕获的异常:聚合失败:{“errmsg”:“异常: 收到来自 mongo1.mscnet.com 的错误响应:27017: { $err: \“超出了 $group 的内存限制,但不允许外部排序。 通过allowDiskUse:true 选择加入。\", code: 16945 }", "code" : 16945, “好的”:0 }

仅供参考:我正在使用 Mongo 2.6

mongodb mapreduce aggregation-framework
4个回答
21
投票

请在运行命令中使用聚合查询,它将允许使用allowDiskUse标签。

db.runCommand(
   { aggregate: "test",
     pipeline: [
                {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
                {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
                {$match: {cnt: 2}}
               ],
     allowDiskUse: true
   }
)

16
投票

如果您使用的是 m10 或更高版本 版本的 MongoDB Atlas,以下是针对

{allowDiskUse: true};
的修复 如果您通过猫鼬从应用程序访问数据,那么它应该是语法即函数。例如:

MongoDb 查询:

db.collection.user.aggregate([], {allowDiskUse: true})

与猫鼬:

User.aggregate([]).allowDiskUse(true);

这将解决应用程序中的错误:)


15
投票

尝试这样写,

db.stocks.aggregate([
                     { $project : { cusip: 1, date: 1, price: 1, _id: 0 } },
                     { $sort : { cusip : 1, date: 1 } }
                    ],
                     {
                       allowDiskUse: true
                     }
                    ); 

还有一件事,
关于最大文档大小的错误是 Mongo 固有的。 Mongo 永远无法返回大于 16 MB 的文档(或其数组)。我无法告诉您原因,因为您没有提到有关数据大小的任何内容,但这可能意味着您作为最终结果构建的文档太大。尝试减少 $limit 参数,也许?首先将其设置为 1,运行测试,然后增加它并查看执行此操作时结果有多大


0
投票

郑重声明:如果您使用 MongoDB Atlas Free Tier共享集群(M0、M2 和 M5)allowDiskUse 选项将被忽略

© www.soinside.com 2019 - 2024. All rights reserved.