2012-07-19 14 views
5

Estoy desarrollando una aplicación web en un nodoj conectado a mongodb a través del conector nativo mongo.Cómo se ordena en una búsqueda nodejs - mongodb, pero llamando a un método dinámico

En una de mis archivos js, tengo un método genérico para invocar una u operación "encontrar" "findOne" para recuperar todo lo que necesito de una colección MongoDB, así:

Funciona bien para mí.

Pero ahora, tengo que ordenar los resultados, y hasta donde yo sé, Mongodb utiliza el método de "ordenar" para lograr esto.

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 { 
        ... 
       }  
      } 
     ); 
    } 
}); 

En una consulta sencilla, esto debería ser así: Por ejemplo:

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

no sé cómo llamar método de "especie", haciéndolo im mi manera genérica.

¿Alguna idea?

Gracias.

+0

¿Puedes dar un poco más detalles sobre lo que estás buscando? –

+0

Lo siento, modifiqué mi pregunta. Espero eso ayude. – larrytron

Respuesta

0

He encontrado la solución.

Parece que "toArray" no se encuentra, de lo contrario no funciona.

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) { 
      ... 
     } 
} 

espero que será útil

5

¿Has mirado en mongojs (https://github.com/gett/mongojs)? Lo uso para mis aplicaciones de nodos y funciona muy bien (también uso expressjs). Usted puede hacer un hallazgo simple y ordenar por con la siguiente sintaxis:

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

gracias. Esto funciona, por supuesto. Pero necesito algo más complejo. Llame este método dinámicamente, (find o findOne) dependiendo de un param. – larrytron

+1

dice sort() solo toma 1 argumento –

+0

Esto ordena mis resultados en el orden más nuevo al más antiguo basado en el campo de marca de tiempo de unix: 'articles.find(). Sort ({created: -1}). ToArray()' (using promise sintaxis) – agm1984

1

no puedes hacer lo mismo con la salida de su llamada ?:

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

Si el tipo sólo puede aplicarse a los resultados de find y no findOne, entonces es un poco más complicado:

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

(Eso último es totalmente no probado, por supuesto, pero parece que debería ser cl ose.)

+0

Es casi lo que necesito, pero no del todo. Escritura nueva publicación con nuevos detalles. – larrytron

0

Debería ser casi como dijo Scott.

El primer método no funciona, porque un objeto indefinido llama a sort. Creo que tiene sentido, porque hay una devolución de llamada que se realiza primero .. El segundo método es casi lo que necesito, pero no funciona, una vez más, findResults.sort devuelve un indefinido.

finalmente hice algo más fácil, lo que parece tener éxito, pero ... todavía hay algo que falta:

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

así, se detiene en "results.sort", y queda a la espera .. . No sé qué. Al mirar la consola de mongodb, no hay consulta iniciada. Por otro lado, la devolución de llamada existe como una función, pero no se llama ...

Luego, traté de hacer esto de otra manera;

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

En este caso, la ejecución continúa, pero devuelve resultados no ordenados.

¿Alguna otra idea? Tiene que estar alli....

gracias

+0

Esto todavía no está funcionando. ¿Alguna idea? – larrytron

1

utilizando los cursores es la mejor solución ya que la clasificación se processeced en el motor 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

tengo un modelo de artículos donde quiero buscar por categoría y obtener el último artículo basado en la fecha de creación y así es como lo hago

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