2012-07-19 6 views
5

Sto sviluppando un'applicazione web in nodejs connessi a mongodb tramite il connettore mongo nativo.Come si ottiene un ordinamento in una ricerca nodejs - mongodb, ma, chiamando un metodo dinamico

In uno dei miei file js, ho un metodo generico di invocare una o operazione "trovare" "findOne" per recuperare tutto quello che ho bisogno da una collezione MongoDB, in questo modo:

Funziona bene per me.

Ma ora, ho bisogno di ordinare i risultati, e per quanto ne so, Mongodb usa il metodo "sort" per raggiungere questo obiettivo.

collection.ensureIndex(indexedFields, function(error, indexName) { 
    if (error) { 
     callback(error); 
    } else { 
     var operation = (params.options.one) ? collection.findOne : collection.find; 

     operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       if (error) { 
        ... 
       } else { 
        ... 
       }  
      } 
     ); 
    } 
}); 

In una semplice query, questo dovrebbe essere simile a questo: Per esempio:

collection.find().sort({field : 1}), 

non so come chiamare il metodo "sort", facendo im mio modo generico.

Qualche idea?

Grazie.

+0

Puoi fornire un altri dettagli su cosa stai cercando? –

+0

Spiacente, ho modificato la mia domanda. Spero che sia d'aiuto. – larrytron

risposta

0

Ho trovato la soluzione.

Sembra che "toArray" mancasse, altrimenti non funziona.

operation.call(collection, params.selector, params.fields, params.options, function(error, result) { 
if (error) { 
    callback(error); 
} else { 
     result.sort(params.sort).toArray(function(error, items) { 
      ... 
     } 
} 

Spero che sarà utile

5

Hai esaminato mongojs (https://github.com/gett/mongojs)? Lo uso per le mie app di nodo e funziona bene (uso anche expressjs). Si può fare un semplice trovare e ordinare in base con la seguente sintassi:

db.test.find().sort({name:1}, function(error, tuples) { console.log(tuples) }); 
+0

grazie. Questo funziona ovviamente. Ma ho bisogno di qualcosa di più complesso. Chiama dinamicamente questo metodo, (trova o trova Uno) a seconda di un parametro. – larrytron

+1

dice sort() richiede solo 1 Argomento –

+0

Questo ha ordinato i miei risultati nel più recente al più vecchio ordine basato sul campo timestamp di unix: 'articles.find(). Sort ({created: -1}). ToArray()' (using promise sintassi) – agm1984

1

non puoi semplicemente fare la stessa cosa con l'uscita della chiamata ?:

 operation.call(collection, params.selector, params.fields, params.options, 
      function(error, result){ 
       ... 
      } 
     ).sort({field: 1}); 

Se l'ordinamento può solo da applicare ai risultati della find e non findOne, allora è un po 'più complicato:

var operation = (params.options.one) ? collection.findOne : function() { 
     var findResults = collection.find.apply(this, [].slice.call(arguments)); 
     return findResults.sort({field: 1}); 
    }; 

(Questo ultimo è del tutto testato, naturalmente, ma sembra che dovrebbe essere cl ose.)

+0

È quasi ciò di cui ho bisogno, ma non del tutto. Sto scrivendo nuovi post con nuovi detal. – larrytron

0

Dovrebbe essere quasi come ha detto Scott.

Il primo metodo non funziona, perché l'ordinamento viene chiamato da un oggetto non definito. Penso che abbia senso, perché c'è un callback che viene eseguito per primo .. Il secondo metodo è quasi quello di cui ho bisogno, ma non funziona, ancora una volta, findResults.sort restituisce un indefinito.

finalmente ho fatto qualcosa di più semplice, quello che sembra avere successo, ma ... c'è ancora qualcosa che manca:

operation.call(collection, params.selector, params.fields, params.options,    
    function(error, result){ 
     if (err) .... 
     else results.sort({field:1}, callback(err, sortedResults)) 
    } 

bene, fa una pausa a "results.sort", e rimane in attesa .. . Non so cosa. Guardando la console di mongodb, non è stata lanciata alcuna query. D'altra parte, il callback esiste come una funzione, ma non viene chiamato ...

Quindi, ho provato a farlo in un altro modo;

var sortedResults = results.sort({field:1}; 
callback(err, sortedResults) 

In questo caso, l'esecuzione continua, ma restituisce risultati non ordinati.

Altre idee? Deve essere lì ....

grazie

+0

Questo non funziona ancora. Qualche idea? – larrytron

1

utilizzando i cursori è la soluzione migliore, perché l'ordinamento è processeced nel motore di MongoDB

var grades = db.collection('data'); 

var cursor = grades.find(); 
// cursor.skip(1); 
// cursor.limit(4); 
// cursor.sort(['State', 1]); 
cursor.sort([['Temperature', 'desc'],['State','asc']]); 

//var options = { 'skip' : 1, 
//    'limit' : 4, 
//    'sort' : [['grade', 1], ['student', -1]] }; 
//var cursor = grades.find({}, {}, options); 

cursor.each(function(err, doc) { 
    if(err) throw err; 
    if(doc == null) { 
     return db.close(); 
    } 
    console.dir(doc); 
}); 
1

Ho un modello di articoli in cui voglio cercare per categoria e ottenere l'ultimo articolo in base alla data di creazione e questo è come lo faccio

const query = {category: "category1"}; 
Articles.find(query, callback).sort({created_date: -1}); 
Problemi correlati