2012-06-11 2 views
12

Интересно, есть ли эквивалентно MySQL-запроса:MongoDB ODM SELECT COUNT (*) эквивалентно

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

Это может работать:

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

Но не тогда все идентификаторы, возвращаемые и как это влияет на производительность, если в базе данных есть более сложные документы. Я не хочу отправлять много данных, чтобы получить счет.

ответ

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

Вышеупомянутое предоставит вам количество документов внутри коллекции пользователей. Этот запрос не возвращает все документы, а затем подсчитывает их. Он генерирует курсор для коллекции, и оттуда он знает счет. Только после того, как вы начнете перебирать курсор, драйвер начинает извлекать данные из базы данных.

Удобный оператор для работы - eagerCursor (true), который будет извлекать все данные в запросе до гидратации и закрывать курсор. Используйте это, если вы знаете данные, которые хотите получить, и после этого вы закончите с ним.

Eager Cursor

Если у вас есть ссылки, которые вы знаете, вы будете итерация. Используйте метод (true).

Prime

Если вы хотите вернуть все элементы исходных данных, вы можете использовать гидрат (ложь) метода в запросе, чтобы отключить систему гидратации.

+0

Woa, получить все документы и посчитайте их ;-( –

36

Небольшой вклад:

если вы бежите на счетный так:

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

Доктрина запускает этот запрос:

db.collection.find(); 

однако, если код выглядит следующим образом:

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

Учения в этом случае выполнить этот запрос:

db.collection.count(); 

Я не знаю, если есть улучшение в производительности, но я думаю, что наиболее оптимальным

Я надеюсь, что это полезно

+0

спасибо lotttt –

+0

Это действительный аргумент. Использование -> count() -> getQuery() -> execute(); это путь. – Dayson

+0

От того, как документы написаны для ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) и ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) похоже, что это не имеет никакого значения. Для обоих: «возвращает количество документов, которые будут соответствовать запросу' find() ', подразумевая, что в любом случае он вызовет' find() '. –

Смежные вопросы