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();
Но не все ли возвращенные идентификаторы и как это влияет на производительность, если в базе данных есть более сложные документы. Я не хочу отправлять много данных, чтобы получить счет.
Ответы
Ответ 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();
Я не знаю, есть ли улучшения в производительности, но я думаю, что наиболее оптимальный
Надеюсь, это полезно