2012-08-09 8 views

Antwort

29

Vom Javadoc of the MongoDB Java Driver, heißt es:

DBCursor.count(): Zählt die Anzahl der Objekte, die Abfrage übereinstimmen. Diese tut nicht nehmen Limit/überspringen in Betracht.

DBCursor.size(): Zählt die Anzahl der Objekte, die der Abfrage entsprechen. Diese berücksichtigt Limit/Skip.

+0

Beide scheinen gleich zu sein ... Warum haben sie noch 2 solcher Methoden eingeführt? Gibt es einen Leistungsunterschied zwischen den beiden? – Byter

+0

Sie sind nicht gleich. Man nimmt Limit/Skip in Betracht aber andere nicht. –

+13

Ich vermute, der Unterschied ist in der "nicht nehmen" und die "nimmt" Limit/überspringen in Betracht. –

1

Mehr als eine Antwort möchte ich auf ein Problem hinweisen, dass unser Team "Mischen" diese beiden konfrontiert.

Wir hatten so etwas wie:

DBCursor cursor = collection.find(query).limit(batchSize); 

logger.info("{} items found.", cursor.count()); 

while (cursor.hasNext()) { 
... 
} 

Es stellte sich heraus, dass die cursor.count() Methode nach dem Aufruf wurde die Grenze ignoriert (bitte bei this andere Frage einen Blick), wir wissen bestimmt, wie viele Elemente wurden von der Abfrage zurückgegeben, sodass wir stattdessen die cursor.size()-Methode aufgerufen haben sollten, da das Aufrufen des count einen unerwünschten Nebeneffekt hatte.

Ich hoffe, dass dies für jeden anderen hilfreich sein könnte, da es nicht so einfach war, die Quelle des Problems zu finden, mit dem wir konfrontiert waren.

+0

Willst du damit sagen, dass '' cursor.count() 'nicht nur das Limit wie dokumentiert ignoriert hat, sondern tatsächlich das Limit vom Cursor entfernt hat, so dass die nachfolgenden Operationen wie das Iterieren des Cursors sich so verhalten, als wäre das Limit nicht gesetzt? –