2016-04-13 4 views
0

Я использую MongoDB v3.2, и я использую драйвер native nodejs v2.1. При запуске агрегации трубопровода на больших наборах данных (1mil + документы), я встречая следующее сообщение об ошибке:MongoDB Aggregation Cursor с драйвером NodeJS

'aggregation result exceeds maximum document size (16MB)' 

Вот мой код агрегация трубопровода:

var eventCollection = myMongoConnection.db.collection('events'); 
var cursor = eventCollection.aggregate([ 
       { 
        $match: { 
         event_type_id: {$eq: 89012} 
        } 
       }, 
       { 
        $group: { 
         _id: "$user_id", 
         score: {$sum: "$points"} 
        } 
       }, 
       { 
        $sort: { 
         score: -1 
        } 
       } 
      ], 
      { 
       cursor: { 
        batchSize: 500 
       }, 
       allowDiskUse: true, 
       explain: false 
      }, function() { 

      }); 

Вещи, которые я пробовал:

//Using cursor event listeners. None of the on listeners seem to work. Always get error about 16mb. 
cursor.on("data", function (data) { 
    console.log("Some data: ", data); 
}); 
cursor.on("end", function (data) { 
    console.log("End of data: ", data); 
}); 

//Using forEach. Which I thought would allow for >16mb because it's used in conjunction with the batchSize and cursor. 
cursor.forEach(function (item) { 

}) 

Я видел в других ответах (How could I write aggregation without exceeds maximum document size?), что мне нужно, чтобы результаты были возвращены курсором, так как я правильно это сделал? Я просто не могу заставить его работать. Любые предложения о том, что должно быть в пакете?

Я использую собственный пакет mongodb - https://github.com/mongodb/node-mongodb-native для проекта nodejs, а не командной строки mongo.

+0

Параметр '.forEach()' не имеет места здесь, так как «агрегация курсор» на самом деле просто [узел «поток»] (https://nodejs.org/api/stream. html), и поэтому только событие «данных» на самом деле что-то делает. Однако, если именно так настроен ваш код, это предполагает, что у вас есть экземпляр сервера MongoDB 2.4 или ниже, который, конечно же, не поддерживает ответ «курсор/поток». Поэтому я предлагаю вам обновить сразу, так как теперь это будет «очень старый» релиз. –

+0

http://stackoverflow.com/questions/29644587/how-could-i-write-aggregation-without-exceeds-maximum-document-size –

+0

Я проверил мой экземпляр MongoDB версии 3.2.1 – mikeyaa

ответ

0

Хорошо, я понял. Он не работал, потому что я передавал функцию обратного вызова в качестве последнего параметра в методе aggregate. Путем передачи значения null это позволило потоку работать должным образом. Изменения показаны ниже:

var cursor = eventCollection.aggregate([ 
      { 
       $match: { 
        event_type_id: {$eq: 89012} 
       } 
      }, 
      { 
       $group: { 
        _id: "$user_id", 
        score: {$sum: "$points"} 
       } 
      }, 
      { 
       $sort: { 
        score: -1 
       } 
      } 
     ], 
     { 
      cursor: { 
       batchSize: 500 
      }, 
      allowDiskUse: true, 
      explain: false 
     }, null);