MongoDB 允许磁盘使用不工作..

Posted

技术标签:

【中文标题】MongoDB 允许磁盘使用不工作..【英文标题】:MongoDB allowDiskUse not working.. 【发布时间】:2015-02-13 23:22:37 【问题描述】:

专家。

我是 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
)

无论我尝试什么变体,我都会收到相同的错误(“Pass allowDiskUse:true to opt in”):

Error("打印堆栈跟踪")@:0 ()@src/mongo/shell/utils.js:37 ([对象数组],[对象对象])@src/mongo/shell/collection.js:866 @(shell):7

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

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

【问题讨论】:

您确定使用的是 2.6 shell 吗? version()mongo shell 中返回什么?另外,您是否使用任何 shell 扩展,例如 Mongo-Hacker?如果是这样,我会尝试使用 mongo --norc 启动 shell 以在没有扩展的情况下进行测试。您的语法看起来是正确的,所以我怀疑您可能无意中使用了不支持将选项传递给聚合命令(在 MongoDB 2.6 shell 中添加)的 aggregate() 助手版本。 我正在使用“MongoDB shell 版本:2.6.5”。虽然,我使用的是名为 RoboMongo(版本 0.8.4)的第三方应用程序。我现在正在使用带有 --norc 的 CMD shell .. 这似乎有效.. 我想这是我的客户。但是你能给我解释一下吗?..聚合不会发生在我的电脑上(是吗?)。我的电脑上没有看到任何网络/cpu 使用情况。那么什么是“客户端”,它如何/为什么影响数据处理?谢谢! mongo shell 或 Robomongo 等客户端提供了aggregate() helpers,以便更方便地使用运行在 MongoDB 服务器上的底层aggregate command。在 2.6 之前的 MongoDB 版本中,聚合命令不支持任何选项,因此旧版本的 aggregate() 助手将忽略这些选项。如果 --norc 适用于 mongo shell,我怀疑您使用的是旧版本的 Mongo-Hacker(我在 2014 年 8 月提交了修复) 我明白了。因此,客户端向服务器发送附加代码(帮助程序),服务器用于构建执行路径和结果 - 而不仅仅是实际命令。再次感谢您! mongo shell 助手只是在将命令发送到服务器之前操作参数(例如,允许您将聚合管道作为数组或管道步骤列表传递)。仅供参考,您可以通过调用不带 () 的方式在 mongo shell 中查看帮助程序代码,例如:db.test.aggregate 【参考方案1】:

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

【讨论】:

【参考方案2】:

试试这样写,

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

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

【讨论】:

【参考方案3】:

如果您使用的是 m10 或更高版本 版本的 MongoDB Atlas,以下是针对 allowDiskUse: true; 的修复程序 如果您通过猫鼬从应用程序访问数据,那么它应该是语法即函数。例如:

MongoDb 查询:

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

与猫鼬:

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

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

【讨论】:

以上是关于MongoDB 允许磁盘使用不工作..的主要内容,如果未能解决你的问题,请参考以下文章

mongodb

mongodb连接问题

MongoDB的配置和使用

node中mongodb数据库的使用(下载使用mongoose包)及mongodb数据库的常用命令

mongodb 不会启动 mongod -> 错误 dbpath 不存在,但路径确实退出

mongodb学习总结