2014-09-18 14 views
7

Nella seguente query:Come ottenere contare prima di limite nella Mongo aggregazione gasdotto

db.orders.aggregate([{ $match : { status: "A"}, { $limit: 5} }]); 

Come posso ottenere il conteggio delle collezioni prima di applicare il limite? Voglio comunque che la chiamata restituisca un array di 5 documenti. Se uso $ group sembra che non conserverebbe la matrice di documenti. Questo può essere fatto in una sola chiamata o devo effettuare due chiamate?

risposta

3

Sfortunatamente, al momento devi effettuare due chiamate, una chiamata con l'operatore $ limit per i risultati seguita da una seconda chiamata per il conteggio. È possibile utilizzare il framework di aggregazione senza l'operatore $ limit e con un operatore $ group per calcolare un conteggio o come wdberkeley indica che è possibile passare i criteri a .count() per ottenere un conteggio invece di utilizzare il framework di aggregazione se si utilizza una singola fase di incontro.

Vedere MongoDB - Aggregation Framework (Total Count).

+1

Utilizzare [.count()] (http://docs.mongodb.org/manual/reference/method/db.collection.count/) per contare il numero totale di risultati. – wdberkeley

+0

@wdberkeley con aggregato non funziona. Devi fare due chiamate, come ha detto Brantino – 1nstinct

+0

Attenzione che se usi '.count()', allora verranno contati i risultati duplicati che potrebbero essere stati eliminati dal gruppo $ nella tua chiamata aggregata. – cib

-1

Un'altra opzione consiste nel limitare i risultati a livello di applicazione anziché nella query Mongo. Quindi è possibile ottenere il conteggio del risultato completo e non è necessario effettuare due chiamate.

Per esempio, in Python fareste:

data = db.orders.aggregate([{ "$match" : { "status": "A"} }])['result'] 
count = len(data) 
data = data[skip:skip+limit] 

Se si dispone di un complicato chiamata di aggregazione su un grande insieme di dati, questo è significativamente più veloce di effettuare due chiamate.

+0

Se il set di dati è molto grande, potrebbe non rientrare nella memoria - è per questo che è possibile ottenere un cursore di streaming anziché caricare tutto il set di risultati nella memoria del server delle applicazioni. Inoltre, l'esecuzione delle operazioni di conteggio da parte del server db farebbe risparmiare tempo affinché il server delle applicazioni eseguisse qualcos'altro. –

Problemi correlati