2012-09-22 12 views
9

Desidero creare una funzione di impaginazione nella mia raccolta. Come si può trovare un documento con posizioni 'inizio' e 'limite' e ottenere il numero totale del documento in una singola query?Come effettuare l'impaginazione con mangusta

risposta

18

Non è possibile ottenere entrambi i risultati in una query; il meglio che puoi fare è quello di farli entrambi utilizzando uno Mongoose Query oggetto:

var query = MyModel.find({}); 
query.count(function(err, count) {...}); 
query.skip(5).limit(10).exec('find', function(err, items) {...}); 

utilizzare un quadro di controllo del flusso, come async ad eseguirli in parallelo in modo pulito, se necessario.

+0

Grazie! Funziona bene per me – Erik

+1

Quando eseguo questo l'exec nella seconda query restituisce lo stesso del conteggio ... La funzione di conteggio modifica la query originale ?? –

+1

@ZekeAlexandreNierenberg Hai ragione, Zeke; che deve essere cambiato come un punto. Ho aggiornato l'esempio per aggiungere il parametro ''find'' alla chiamata' exec' per farlo funzionare con Mongoose 3.6.20. – JohnnyHK

1

UPDATE:

Uso saltare e limite non è buono per impaginazione. Here is the discussion over it.

@Wes Freeman, ha dato una buona risposta. Ho letto la posa collegata, dovresti usare la query di intervallo. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}});

RISPOSTA VECCHIO (non usare questo)

uso qualcosa come

n = db.students.find().skip(n).limit(10); 
//pass n dynamically, so for page 1 it should be 0 , page 2 it should be 10 etc 

maggiore documentazione a http://www.mongodb.org/display/DOCS/Advanced+Queries

+0

Grazie per la risposta, ma è necessario il conteggio totale dei documenti. – Erik

+0

totale = db.students.find(). Count() –

+0

Wes Freeman, ha dato una buona risposta. Ho letto la posa collegata, dovresti usare la query di intervallo. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}}); –

3

Se si prevede di avere un sacco di pagine, non si dovrebbe usare skip/limit, ma piuttosto calcolare intervalli.

risposta

Sede di Scott per una domanda simile: MongoDB - paging

6

È possibile utilizzare il plugin Mongoose Paginate:

$ npm install mongoose-paginate 

Dopo nei vostri percorsi o il controller, basta aggiungere:

Model.paginate({}, { page: 3, limit: 10 }, function(err, result) { 
    // result.docs 
    // result.total 
    // result.limit - 10 
    // result.page - 3 
    // result.pages 
}); 
0
user.find({_id:{$nin:friends_id},_id:{$ne:userId}},function(err,user_details){ 
    if (err) 
    res.send(err); 
    response ={ 
     statusCode:200, 
     status:true, 
     values:user_details 
    } 
    res.json(response); 
    }).skip(10).limit(1); 
+3

La tua risposta può essere quella giusta, ma cerca di aggiungere più contesto al tuo codice per aiutare tutti quelli che potrebbero cercare lo stesso. Si prega di fare riferimento a [Come scrivere una buona risposta?] (Https://stackoverflow.com/help/how-to-answer) – rmjoia

+0

Spiegare che cosa fa il codice della risposta in modo che le persone con scarsa conoscenza nelle tecnologie coinvolte avere la possibilità di capirlo e riutilizzarlo – Wndrr