4

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

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
   }
}

]) 

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

这怎么可能?

4

1 回答 1

7

当然,不同之处在于该.aggregate()方法返回一个“光标”,而您提供给runCommand()您的选项则不是。这实际上是作为单个 BSON 文档返回响应的遗留形式,具有所有限制。另一方面,光标没有限制。

当然,您可以使用该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 文档”响应。按照此处显示的方式运行它,您会得到相同的“光标”响应。

于 2018-05-03T12:00:42.170 回答