2016-11-09 7 views
0

Nach MongoDB Hand der folgende Code erschöpft das Array und speichert die der von der Abfrage zurück docs RAM:Cursor.toArray() Umsetzung

var myCurse = db.coll.find(); 
var docs = myCurse.toArray() 

Wenn ich in dem Befehl ein:

myCurse.forEach(printjson); 

Nach den ersten beiden Befehlen wird nichts zurückgegeben. Also im Grunde ist der Cursor erschöpft. Alles sieht gut hier aus.

Jetzt tun, wenn die folgende Liste:

var myCurse = db.coll.find(); 
myCurse.toArray()[1]; 

und dann:

myCurse.toArray()[2]; 

ich noch Ergebnisse.

Meine Fragen sind:

  1. tut myCurse.toArray()[i]; wo i ein Index ist, unterhalb eines Arrays implementieren, so dass myCurse.toArray()[i]; mehrfach verwendet werden können.
  2. Wie lange werden die Dokumente im RAM gespeichert?
  3. Was passiert, wenn die Größe zurückgegebener Dokumente die RAM-Größe überschreitet?

Mit MongoDB 3.2.8

Antwort

1

Cursor.toArray() geht durch den ganzen Cursor, die Ergebnisse in einem Array setzen, bis es keine weiteren Treffer. Der Cursor ist jetzt "verbraucht", wenn Sie möchten, aber das Ergebnis ist ein ganz normales Array.

Diese Dokumente werden im RAM gespeichert, bis die Garbage-Collection diese löscht. Mit anderen Worten, mindestens so lange, wie Sie einen Verweis auf das Array oder einen der Einträge im Array behalten. Danach sind alle Wetten deaktiviert. Sie können schnell entfernt werden oder sie bleiben für eine Weile, aber es ist im Allgemeinen nichts, worüber man sich Sorgen machen muss.

Ich bin noch nie auf ein Szenario gestoßen, in dem die Größe der zurückgegebenen Dokumente die RAM-Größe übersteigt, aber ich erwarte, dass Seitendateien verwendet werden (falls die Anwendung so viel RAM verwenden darf) und schließlich Es wird eine Ausnahme geben, wenn Sie nicht mehr genügend Speicherplatz haben. Wenn Sie auf diese Weise mit erheblichen Datenmengen umgehen müssen, verwenden Sie nicht toArray(), da dies ohnehin äußerst ineffizient wäre.