runCommand против агрегатного метода для агрегации - PullRequest
0 голосов
/ 03 мая 2018

Для запуска запроса агрегации можно использовать любой из них:

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

]) 

работает (дает ожидаемый результат агрегирования).

Как это возможно?

1 Ответ

0 голосов
/ 03 мая 2018

Разница, конечно, в том, что метод .aggregate() возвращает «курсор» , где в качестве опций вы предоставляете runCommand() ты не. На самом деле это была устаревшая форма, которая возвращала ответ в виде одного документа BSON со всеми его ограничениями . Курсоры, с другой стороны, не имеют ограничений.

Конечно, вы можете использовать метод runCommand(), чтобы «создать свой собственный курсор» с оболочкой, поскольку в конце концов это именно то, чем является метод .aggregate(). занимаюсь "под одеялом". То же самое касается всех драйверов, которые по существу вызывают команду базы данных для всего.

С помощью оболочки вы можете преобразовать ваш запрос следующим образом:

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». Запустите его так, как показано здесь, и вы получите тот же самый ответ «курсора».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...