2012-06-11 18 views
12

Ich frage mich, ob es ein Äquivalent zu der MySQL-Abfrage:MongoDB ODM SELECT COUNT (*) äquivalent

"SELECT COUNT(*) FROM users" in MongoDB ODM? 

Dies könnte funktionieren:

$qb = $this->dm->createQueryBuilder('Documents\Functional\Users'); 
$qb->select('id'); 
$query = $qb->getQuery(); 
$results = $query->execute(); 
echo $query->count(); 

Aber sind dann nicht alle zurückgegebenen IDs und wie wirkt sich dies auf die Leistung aus, wenn komplexere Dokumente in der Datenbank vorhanden sind? Ich möchte nicht zu viele Daten senden, nur um zu zählen.

Antwort

22
$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
      ->getQuery()->execute()->count(); 

Die oben genannten gibt Ihnen die Anzahl der Dokumente in einer Sammlung von Benutzern. Die fragliche Abfrage gibt nicht alle Dokumente zurück und zählt sie dann. Er erzeugt einen Cursor zur Sammlung und von dort kennt er die Zählung. Erst wenn Sie anfangen, über den Cursor zu iterieren, fängt der Treiber an, Daten aus der Datenbank zu ziehen.

Ein handlicher Operator für die Leistung ist die eagerCursor (true), die alle Daten in der Abfrage vor der Hydration abrufen und den Cursor schließen. Verwenden Sie dies, wenn Sie die gewünschten Daten kennen und nach der Abfrage fertig sind.

Eager Cursor

Wenn Sie Referenzen, die Sie wissen, dass Sie iterieren wird. Verwenden Sie die Prime (True) Methode auf ihnen.

Prime

Wenn Sie alle Elemente Rohdaten zurückkehren möchten, können Sie Hydrat (false) Methode in der Abfrage verwenden, um die Trinksystem zu deaktivieren.

+0

Woa, alle Dokumente abrufen und zählen sie ;-( –

36

Ein kleiner Beitrag:

, wenn Sie die Zählung auf diese Weise auszuführen:

db.collection.find(); 

jedoch, wenn der Code wie folgt::

$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
     ->getQuery()->execute()->count(); 

Lehre diese Abfrage läuft

$count = $this->dm->createQueryBuilder('Documents\Functional\Users') 
     ->count()->getQuery()->execute(); 

Lehre in diesem Fall diese Abfrage ausführen:

db.collection.count(); 

Ich weiß nicht, ob es Verbesserungen in der Leistung, aber ich denke, die meist optimal

Ich hoffe, das ist hilfreich

+0

danke ein lotttt –

+0

Dies ist ein gültiges Argument. Verwenden Sie -> count() -> getQuery() -> execute(); ist der Weg zu gehen. – Dayson

+0

Aus der Art, wie die Dokumente für ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) und ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) es klingt, als ob es keinen Unterschied macht. Für beide "gibt die Anzahl der Dokumente zurück, die zu einer' find() 'Abfrage passen würden.", Was bedeutet, dass entweder 'find()' letztendlich aufgerufen wird. –