2014-12-15 6 views
8

Experten.MongoDB allowDiskUse funktioniert nicht ..

Ich bin neu in MongoDB, aber weiß genug, um mich selbst in Schwierigkeiten .. Fall in Punkt:

db.test.aggregate(
[ 
    {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
    {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
    {$match: {cnt: 2}} 
], 
    {allowDiskUse : true} 
) 

und egal, welche Variationen ich versuche, halte ich den gleichen Fehler ("Pass allowDiskUse: true in opt "):

Fehler (" Drucken Stack Trace ") @: 0() @ src/mongo/shell/utils.js: 37 ([object Array], [object Object ]) @ src/mongo/shell/sammlung.js: 866 @ (shell): 7

Uncaught Ausnahme: Aggregat fehlgeschlagen: {"errmsg": "Ausnahme: Fehler empfangen in Antwort von mongo1.mscnet.com:27017: {$ err: \" Speichergrenze für $ -Gruppe überschritten, , aber nicht zulassen, extern Sortieren. Pass allowDiskUse. Gilt zu entscheiden \ "Code: 16945}", "Code": 16945, "ok": 0 }

Zur Info: Ich bin mit Mongo 2.6

+0

Verwenden Sie definitiv eine 2.6-Shell? Was gibt 'version()' in der 'mongo'-Shell zurück? Verwenden Sie auch Shell-Erweiterungen wie Mongo-Hacker? Wenn ja, würde ich versuchen, die Shell mit 'mongo --norc' zu starten, um ohne Erweiterungen zu testen. Ihre Syntax sieht korrekt aus, so dass ich vermute, dass Sie versehentlich eine Version des 'aggregate()' -Helfers verwenden, der keine Übergabe von Optionen an den Aggregationsbefehl unterstützt (die in der MongoDB 2.6-Shell hinzugefügt wurden). – Stennie

+0

Ich benutze "MongoDB Shell Version: 2.6.5". Obwohl ich eine Drittanbieter-App namens RoboMongo (Version 0.8.4) verwendet. Ich benutze jetzt die CMD-Shell mit --norc .. und das scheint zu funktionieren. Ich denke, es war mein Client. Aber können Sie etwas für mich erklären? .. Die Aggregation passiert nicht auf meinem PC (tut es?). Ich sehe keine Netzwerk/CPU-Nutzung auf meinem PC. Was ist der "Client" und wie/warum beeinflusst er die Verarbeitung von Daten? Vielen Dank! –

+1

Clients wie die 'mongo'-Shell oder Robomongo stellen [' aggregate() 'Helfer] (http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/) zur Verfügung, um das Arbeiten zu erleichtern mit dem zugrunde liegenden Befehl [aggregate] (http://docs.mongodb.org/manual/reference/command/aggregate/), der auf Ihrem MongoDB-Server ausgeführt wird. In Versionen von MongoDB vor 2.6 hat der aggregierte Befehl keine Optionen unterstützt, so dass ältere Versionen der 'aggregate()' Helfer diese ignorieren. Wenn '--norc' für die 'Mongo'-Shell funktioniert, vermute ich, dass Sie eine ältere Version von Mongo-Hacker haben (Ich habe eine Korrektur im August 2014 vorgenommen) – Stennie

Antwort

15

Bitte verwenden Sie die Aggregatabfrage im run-Befehl, damit das allowDiskUse-Tag verwendet werden kann.

db.runCommand(
    { aggregate: "test", 
    pipeline: [ 
       {$group: {_id: {email: "$email", gender: "$gender"}, cnt: {$sum: 1}}}, 
       {$group: {_id: "$_id.email", cnt: {$sum: 1}}}, 
       {$match: {cnt: 2}} 
       ], 
    allowDiskUse: true 
    } 
) 
3

Versuchen Sie, wie das Schreiben,

db.stocks.aggregate([ 
        { $project : { cusip: 1, date: 1, price: 1, _id: 0 } }, 
        { $sort : { cusip : 1, date: 1 } } 
        ], 
        { 
         allowDiskUse: true 
        } 
        ); 

Und noch eine Sache,
Ihr Fehler über maximale Dokumentengröße zu Mongo inhärent. Mongo kann niemals ein Dokument (oder ein Array davon) größer als 16 Megabyte zurückgeben. Ich kann Ihnen nicht sagen, warum, weil Sie nichts über die Datengröße erwähnt haben, aber es bedeutet wahrscheinlich, dass das Dokument, das Sie als Endergebnis erstellen, zu groß ist. Versuchen Sie, den $ limit-Parameter zu verringern, vielleicht? Beginnen Sie, indem Sie es auf 1 setzen, einen Test durchführen, dann erhöhen und sehen, wie groß das Ergebnis wird, wenn Sie das tun