Подтвердить что ты не робот

MongoDB ODM SELECT COUNT (*) эквивалент

Интересно, есть ли эквивалент MySQL-Query:

   "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(); 

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

4b9b3361

Ответ 1

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

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

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

Ожидаемый курсор

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

Prime

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

Ответ 2

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

если вы запустили счет таким образом:

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

Doctrine выполняет этот запрос:

db.collection.find();

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

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

В этом случае Doctrine запускает этот запрос:

db.collection.count();

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

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