2012-04-04 5 views
0

Was ist die effizienteste Möglichkeit, Mongo-Sammlungen in Batches abzufragen? Zum Beispiel in SQL würde ich so etwas wie:Equivalent Mongodb Idiom für Batch-Abfragen

SELECT * FROM Foo WHERE id > {{floor}} limit 1000; 

ich gefunden habe, dass ich etwas tun kann, als here skizzierte

aber die große Warnung über skip macht mich denken, ich sollte das nicht verwenden. (Angenommen, die Sammlung ist groß genug, damit sie wichtig ist).

Meine Sammlung enthält keine Indizes neben dem automatisch generierten _id-Feld. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, das zu benutzen und $ gt $ lt.

Wenn es darauf ankommt, werde ich den Casbah Treiber verwenden, falls es geheime Sauce ist eingebaut.

Antwort

2

Die wörtliche Übersetzung dieser SQL-Abfrage Mongo

ist
db.foo.find({"id": {"$gt": floor}}).limit(1000) 

Diese Abfrage kann von einem Index für das Feld id bedient werden (oder durch den Standardindex _id, wenn Sie diese Spalte anstelle eines namens id verwenden).

Es gibt keine Leistungsprobleme mit limit(), aber skip() für sehr große Werte können schlecht funktionieren, da der Server im Wesentlichen viele Datensätze durchlaufen muss, bevor er Ergebnisse an Sie zurückgeben kann.

+0

richtig, ich habe nur die _id default index, und so kenne ich nicht die min-id um zu starten. Obwohl, ich nehme an, wenn ich bei 0 anfange und 1000 begrenze, und dann die letzte _id nehme und es inkrementiere, könnte es funktionieren ... richtig? –

+0

Tatsächlich scheint ich etwas wie db.foo.find ({_id: {$ gt: new ObjectId ("00000000000000000000000000")}}) .limit (1000) zu tun, um mich zu starten. Nett. –

+1

Für die Paginierung wird diese Methode (Erinnerung an die letzte, dann unmittelbar danach) empfohlen. Sie können 'db.foo.find ({_ id: {$ gt: {last_object_id}}). Sort ({_ id: 1}) .limit (num_per_page)'. Rembmer, um die 'sort()' zu verwenden, sonst können Sie schrullige Ergebnisse erhalten. – dcrosta