mongodb - runCommand 与聚合方法进行聚合

标签 mongodb aggregation-framework runcommand

要运行聚合查询,可以使用以下任一方法:

db.collectionName.aggregate(query1);

db.runCommand(query2)

但是今天早上我注意到了一些奇怪的事情。虽然这样:

db.runCommand(

{
   "aggregate":"collectionName",
    allowDiskUse: true,
   "pipeline":[
      {
         "$match":{
            "field":param


         }
      }

   ]
});

失败并出现错误:

{
    "ok" : 0.0,
    "errmsg" : "aggregation result exceeds maximum document size (16MB)",
    "code" : 16389,
    "codeName" : "Location16389"
}

这个:

db.collectionName.aggregate([

{
  $match: {
           field: param
   }
}

]) 

正在工作(给出预期的聚合结果)。

这怎么可能?

最佳答案

嗯,区别当然是 .aggregate()方法返回 "cursor" ,其中您提供给 runCommand() 的选项你不是。这实际上是旧形式,它将响应作为单个 BSON 文档返回,其中包含所有 it's limitations。 .另一方面,游标没有限制。

当然你可以使用 runCommand()使用 shell “制作你自己的光标”的方法,因为毕竟这正是 .aggregate() 的内容方法是在“幕后”进行。这同样适用于所有驱动程序,它们基本上为所有内容调用数据库命令。

使用 shell,您可以像这样转换您的请求:

var cmdRes = db.runReadCommand({
   "aggregate": "collectionName",
   "allowDiskUse": true,
   "pipeline":[
      {
         "$match":{
            "field":param
         }
      }
   ],
   "cursor": { "batchSize": 25 }
});

var cursor = new DBCommandCursor(db, cmdRes);

cursor.next();   // will actually iterate the cursor

如果您真的想深入研究它,请输入不带括号 ()db.collectionName.aggregate,以便您实际打印函数定义。这将向您展示一些其他的函数调用,您可以进一步深入研究它们,并最终看到上面显示的行的有效内容,以及许多其他内容。

但是您运行它的方式是“单个 BSON 文档”响应。按照此处显示的方式运行它,您会得到相同的“光标”响应。

关于mongodb - runCommand 与聚合方法进行聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50153872/

相关文章:

python - Pymongo:从数组中删除一个元素

node.js - 如何在 mongoose 和 node.js 中进行查询以根据值对用户进行计数(类似于 mysql Distinct)?

mongodb - 如何删除mongodb中group返回的文档?

mongodb - 仅返回嵌套数组中匹配的子文档元素

azure run 命令脚本来挂载文件存储

javascript - 使用 Node.js、Express 和 MongoDB 通过 ISODate 查找

javascript - 一个查询即可找到具有一个引用的每个子项

java - 尝试创建存储库实例时出现 org.springframework.data.mapping.MappingException