2016-04-13 13 views
0

Ich verwende MongoDB v3.2 und verwende den nativen nodejs-Treiber v2.1. Wenn die Aggregation Pipeline auf große Datenmengen (1 mil + Dokumente) läuft, bin ich die Begegnung mit dem folgenden Fehler:MongoDB-Aggregationscursor mit NodeJS-Treiber

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

Hier ist meine Aggregation Pipeline Code:

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() { 

      }); 

Dinge, die ich versucht habe:

Ich habe in anderen Antworten (How could I write aggregation without exceeds maximum document size?) gesehen, dass ich die Ergebnisse von einem Cursor zurückgegeben haben muss, also wie mache ich das richtig? Ich kann es einfach nicht zur Arbeit bringen. Irgendwelche Vorschläge, was die BatchSize sein sollte?

Ich verwende das native mongodb-Paket - https://github.com/mongodb/node-mongodb-native für ein Nodejs-Projekt nicht die Mongo-Befehlszeile.

+0

Die '.forEach()' hat hier keinen Platz, da ein "Aggregation Cursor" ist eigentlich nur ein [node "Strom"] (https://nodejs.org/api/stream. html) Schnittstelle, und daher nur das Ereignis "data" tatsächlich etwas tut. Wenn Ihr Code jedoch tatsächlich so eingerichtet ist, würde dies bedeuten, dass Sie eine MongoDB 2.4 oder eine niedrigere Serverinstanz haben, die natürlich keine "cursor/stream" -Antwort unterstützt. Ich würde daher vorschlagen, dass Sie sofort upgraden, denn das wäre jetzt eine "sehr alte" Veröffentlichung. –

+0

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

+0

Ich habe meine MongoDB-Instanz Version 3.2.1 – mikeyaa

Antwort

0

Ok, ich habe es herausgefunden. Es funktionierte nicht, weil ich eine Rückruffunktion als letzten Parameter in der Aggregatmethode übergab. Durch das Übergeben von NULL konnte der Stream wie erwartet funktionieren. Änderungen unten gezeigt:

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);