Estoy desarrollando una pequeña aplicación web NodeJS usando Mongoose para acceder a mi base de datos MongoDB. A continuación se muestra un esquema simplificado de mi colección:
var MySchema = mongoose.Schema({ content: { type: String }, location: { lat: { type: Number }, lng: { type: Number }, }, modifierValue: { type: Number } });Desafortunadamente, no puedo ordenar los datos recuperados del servidor de la forma que me resulte más conveniente. Deseo ordenar mis resultados según su distancia desde una posición dada ( ubicación ) pero teniendo en cuenta una función de modificación con un valor de modificación que también se considera como una entrada.
Lo que tengo la intención de hacer está escrito a continuación. Sin embargo, este tipo de funcionalidad de clasificación parece no existir.
MySchema.find({}) .sort( modifierFunction(location,this.location,this.modifierValue) ) .limit(20) // I only want the 20 "closest" documents .exec(callback)mondifierFunction devuelve un Double.
Hasta ahora, he estudiado la posibilidad de usar la función $near de mongoose, pero esto no parece resolverse, no permite una función modificadora.
Dado que soy bastante nuevo en node.js y mongoose, es posible que esté adoptando un enfoque completamente incorrecto para mi problema, por lo que estoy abierto a rediseños completos de mi lógica de programación.
Gracias de antemano,
Es posible que ya haya encontrado una respuesta a esto dada la fecha de la pregunta, pero responderé de todos modos.
Para algoritmos de clasificación más avanzados, puede realizar la clasificación en la devolución de llamada ejecutiva. Por ejemplo
MySchema.find({}) .limit(20) .exec(function(err, instances) { let sorted = mySort(instances); // Sorting here // Boilerplate output that has nothing to do with the sorting. let response = { }; if (err) { response = handleError(err); } else { response.status = HttpStatus.OK; response.message = sorted; } res.status(response.status).json(response.message); }) mySort() tiene la matriz encontrada de la ejecución de la consulta como entrada y la matriz ordenada como salida. Por ejemplo, podría ser algo como esto.
function mySort (array) { array.sort(function (a, b) { let distanceA = Math.sqrt(a.location.lat**2 + a.location.lng**2); let distanceB = Math.sqrt(b.location.lat**2 + b.location.lng**2); if (distanceA < distanceB) { return -1; } else if (distanceA > distanceB) { return 1; } else { return 0; } }) return array; } Este algoritmo de clasificación es solo una ilustración de cómo se podría realizar la clasificación. Por supuesto, tendría que escribir el algoritmo adecuado usted mismo. Recuerda que el resultado de la consulta es una matriz que puedes manipular como quieras. array.sort() es tu amigo. Puede obtener información al respecto aquí .