2012-06-11 31 views
12

Zastanawiam się, czy istnieje odpowiednik MySQL Query:MongoDB ODM SELECT COUNT (*) odpowiednik

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

Może to działa:

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

Ale nie są to wszystkie identyfikatory zwracane i jak wpływa to na wydajność, jeśli w bazie danych znajdują się bardziej złożone dokumenty. Nie chcę wysyłać zbyt wielu danych tylko po to, żeby się liczyć.

Odpowiedz

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

Powyższe daje liczbę dokumentów w kolekcji użytkowników. Zapytanie, o którym mowa, nie zwraca wszystkich dokumentów, a następnie je policz. Generuje kursor do kolekcji, a stamtąd zna licznik. Dopiero po rozpoczęciu iteracji nad kursorem sterownik zaczyna pobierać dane z bazy danych.

Poręcznym operatorem wydajności jest eagerCursor (true), który pobierze wszystkie dane w zapytaniu przed nawodnieniem i zamknie kursor. Użyj tego, jeśli znasz dane, które chcesz uzyskać, a skończysz po zapytaniu.

Eager Cursor

Jeśli posiadasz referencje, które znasz będzie iteracji skończona. Użyj metody prime (true) na nich.

Prime

Jeśli chcesz zwrócić wszystkie elementy surowe dane, można użyć hydrat (fałsz) metoda w zapytaniu do wyłączenia systemu nawodnienia.

+0

WOA, pobierać wszystkie dokumenty i policz je ;-( –

36

Niewielki wkład:

jeśli uruchomić Hrabia ten sposób:

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

Doktryna prowadzi to zapytanie:

db.collection.find(); 

jednak, jeśli kod jest następujący:

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

Doctrine w tym przypadku uruchomić tę kwerendę:

db.collection.count(); 

ja nie wiem, czy jest poprawa wydajności, ale myślę, że najbardziej optymalnym

Mam nadzieję, że jest pomocny

+0

dziękuję za dużo –

+0

To jest poprawny argument. Korzystanie z -> count() -> getQuery() -> execute(); jest drogą do zrobienia. – Dayson

+0

Ze sposobu, w jaki dokumenty są sformułowane dla ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) i ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) brzmi jak to nie ma znaczenia. W obu przypadkach "zwraca liczbę dokumentów, które pasują do zapytania' find() '.", Co oznacza, że ​​jedno z nich ostatecznie nazwie 'find()'. –