2012-06-11 14 views
12

Me pregunto si hay un equivalente a la de MySQL-consulta:MongoDB ODM SELECT COUNT (*) equivalente

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

esto podría funcionar:

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

pero no están entonces todos los identificadores devueltos y cómo afecta esto el rendimiento si hay documentos más complejos en la base de datos. No quiero enviar demasiados datos solo para obtener un conteo.

Respuesta

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

Lo anterior le dará la cantidad de documentos dentro de una colección de Usuarios. La consulta en cuestión no devuelve todos los documentos y luego los cuenta. Genera un cursor a la colección y desde allí conoce el recuento. Solo cuando comienza a iterar sobre el cursor, el controlador comienza a extraer datos de la base de datos.

Un operador útil para el rendimiento es el eagerCursor (verdadero) que recuperará todos los datos en la consulta antes de la hidratación y cerrará el cursor. Úselo si conoce los datos que desea obtener y habrá terminado con ellos después de la consulta.

Eager Cursor

Si tiene referencias que usted sabe que va a recorrer en iteración. Utilice el método principal (verdadero) en ellos.

Prime

Si desea devolver todos los elementos de datos en bruto, puede utilizar hidrato (falso) método en la consulta para desactivar el sistema de hidratación.

+0

Woa, recuperar todos los documentos y cuéntelos ;-( –

36

Una pequeña contribución:

si ejecuta el recuento de esta manera:

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

Doctrina ejecuta esta consulta:

db.collection.find(); 

Sin embargo, si el código es el siguiente:

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

Doctrina en este caso, ejecute esta consulta:

db.collection.count(); 

No sé si hay una mejora en el rendimiento, pero creo que más óptima

espero que sea útil

+0

gracias a muchttt –

+0

Este es un argumento válido. Usando -> count() -> getQuery() -> execute(); es el camino a seguir. – Dayson

+0

De la forma en que los documentos están redactados para ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) y ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) parece que no hace ninguna diferencia. Para ambos, "devuelve el recuento de documentos que coincidirían con una consulta' find() '.", Lo que implica que cualquiera de los dos llamará 'find()' en última instancia. –

Cuestiones relacionadas