2012-06-11 15 views
12

Mi chiedo se c'è un equivalente del MySQL Query:MongoDB ODM SELECT COUNT (*) equivalente

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

questo potrebbe funzionare:

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

ma non sono poi tutti gli ID restituiti e come questo influisce sulle prestazioni se ci sono documenti più complessi nel database. Non voglio inviare molti dati solo per ottenere un conteggio.

risposta

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

Quanto sopra vi fornirà il numero di documenti all'interno di una raccolta di utenti. La query in questione non restituisce tutti i documenti e quindi li conteggia. Genera un cursore alla raccolta e da lì conosce il conteggio. Solo una volta che si inizia a scorrere il cursore, il driver inizia a estrarre i dati dal database.

Un operatore pratico per le prestazioni è il eagerCursor (true) che recupera tutti i dati nella query prima dell'idratazione e chiude il cursore. Utilizzare questo se si conoscono i dati che si desidera ottenere e si sarà finito con esso dopo la query.

Eager Cursor

Se si dispone di riferimenti che si sappia che vi sarà l'iterazione. Utilizzare il metodo prime (true) su di essi.

Prime

Se si desidera restituire tutti gli elementi dati grezzi, è possibile utilizzare idrato (false) metodo nella query per disattivare il sistema di idratazione.

+0

Woa, recuperare tutti i documenti e contali ;-( –

36

Un piccolo contributo:

se si esegue il conteggio in questo modo:

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

Dottrina gestisce questa query:

db.collection.find(); 

tuttavia, se il codice è il seguente:

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

dottrina in questo caso eseguita questa interrogazione:

db.collection.count(); 

Non so se c'è un miglioramento in termini di prestazioni, ma penso che più ottimale

Spero che sia utile

+0

grazie a lotttt –

+0

Questo è un argomento valido. Usando -> count() -> getQuery() -> execute(); è la strada da percorrere. – Dayson

+0

Dal modo in cui i documenti sono formulati per ['db.collection.count()'] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) e ['cursor.count() '] (http://docs.mongodb.org/manual/reference/method/cursor.count/) sembra che non faccia alcuna differenza. Per entrambi ", restituisce il conteggio dei documenti che corrispondono a una query' find(). ", Implicando che uno dei due chiamerà" find() "alla fine. –

Problemi correlati