2016-09-27 7 views
2

Das Ausführen der folgenden Mongo-Abfrage in RoboMongo (0.9.0-RC09) gibt die richtige Anzahl von Dokumenten (mithilfe der Cursor-Zählfunktion), während das Iterieren aller Dokumente nur einen kleinen Teil der Dokumente zurückgibt :MongoDB-Cursor gibt nicht alle Dokumente zurück

var allDocuments = db.getCollection('mycollection').find({}); 
print(allDocuments.size()); // prints 170 000 -> correct 

var count = 0; 
allDocuments.forEach(function(doc) { 
    count++; 
}); 
print(count); // 'randomly' prints values between 30 000 and 44 000 

Haben wir speziell konfigurieren müssen die Abfrage alle Dokumente zurück?

Antwort

4

Problem gelöst: Dies ist eine Frage der robomongo shellTimeoutSec Konfiguration (Standard: 15 Sekunden), die den Curser verursacht zu stoppen mehr Elemente zurückkehrt.

Dies erklärt auch die "zufällige" Zählung von 30 000 bis 44 000 (abhängig von der Netzwerkgeschwindigkeit). Hier ist das Ticket von robomogo: https://github.com/paralect/robomongo/issues/1106#issuecomment-230258348

Die Fehlerbehebung/Abhilfe für jetzt ist shellTimeoutSec in robomongo.json zu erhöhen:

Windows 
0.9.x 
    C:\Users\<user>\.config\robomongo\0.9\robomongo.json 
0.8.x 
    C:\Users\<user>\.config\robomongo\robomongo.json 
MAC 
0.9.x 
    /Users/<user>/.config/robomongo/0.9/robomongo.json 
0.8.x 
    /Users/<user>/.config/robomongo/robomongo.json  
Linux 
0.9.x 
    /home/<user>/.config/robomongo/0.9/robomongo.json 
0.8.x 
    /home/<user>/.config/robomongo/robomongo.json 
+0

ohhh, ich fand es, thx Gott. –

+0

Danke! War mich verrückt, als ich merkte, dass nicht alle Updates abgeschlossen wurden, aber keine Diagnose/Warnungen - wtf ?? – randomsock

-1

Wir müssen in Array konvertieren. Danach können wir nur für Jederzeit tun. Versuchen Sie unten !!!

var allDocuments = db.getCollection('mycollection').find({}).toArray(); 
print(allDocuments.length); 
var count = 0; 
allDocuments.forEach(function(doc) { 
count++; 
print("IterCount : ",count); 
}); 
print("FinalCount : ",count); 

// Mit Cursor

db.getCollection('mycollection').find({}).forEach(function(doc){ 
count++; 
print("IterCount : ",count);}); 
+0

forEach auf dem Cursor definiert und funktionieren soll, als Dokument in https://docs.mongodb.com/manual/reference/method/cursor.forEach/ (wir verwenden mongodb 3.2.6) – hupfis

+0

Dieser Vorschlag lädt alle Daten im Speicher. Nicht unbedingt eine gute Idee. – qqilihq

+0

Hallo Hupfis! Der Cursor wird sofort geschlossen, sobald der Vorgang abgeschlossen ist. Es funktioniert nach einiger Zeit der Cursor schließen, so dass Sie kein Ergebnis erhalten. Ich werde die Antwort bearbeiten, die Sie ausprobieren –

Verwandte Themen