MongoDB allowDiskUse不工作..

时间:2014-12-15 19:04:36

标签: mongodb mapreduce aggregation-framework

专家。

我是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   ([object Array],[object Object])@ src / mongo / shell / collection.js:866   @(壳):7

     

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

仅供参考:我使用的是Mongo 2.6

3 个答案:

答案 0 :(得分:16)

请在运行命令中使用聚合查询,它将允许使用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
   }
)

答案 1 :(得分:6)

尝试这样写,

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

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

答案 2 :(得分:0)

如果您使用的是 m10或更高版本的MongoDB Atlas,以下是{allowDiskUse: true};的修复程序 如果您要通过猫鼬从应用程序访问数据,则它应为函数语法。例如:

MongoDb查询:

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

猫鼬:

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

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