2017-01-03 1 views
4

Я разрабатываю небольшое веб-приложение NodeJS с использованием Mongoose для доступа к моей базе данных MongoDB. Упрощенная схема моей коллекции приводится ниже:Как определить функцию сортировки в Mongoose

var MySchema = mongoose.Schema({         
    content: { type: String },  
    location: {               
     lat:  { type: Number },      
     lng:  { type: Number },            
    }, 
    modifierValue: { type: Number }  
}); 

К сожалению, я не в состоянии сортировать полученные данные с сервера так, как это более удобно для меня. Я хочу сортировать результаты в соответствии с их расстоянием от заданной позиции (, местоположение), но с учетом функции модификатора с модификатором Value, который также рассматривается как вход.

То, что я намереваюсь сделать, написано ниже. Однако такого рода функции сортировки, похоже, не существуют.

MySchema.find({}) 
     .sort(modifierFunction(location,this.location,this.modifierValue)) 
     .limit(20)  // I only want the 20 "closest" documents 
     .exec(callback) 

Концентратор возвращает двойной.

До сих пор я изучал возможность использования функции $ mongoose $ close, но это, похоже, не сортирует, не допускает модификатор.

Поскольку я довольно новичок в node.js и mongoose, я могу принять совершенно неправильный подход к моей проблеме, поэтому я открыт для завершения редизайна моей логики программирования.

Спасибо заранее,

ответ

1

Вы, возможно, нашли ответ на это уже дал дату вопрос, но я отвечу так или иначе.

Для более сложных алгоритмов сортировки вы можете выполнить сортировку в обратном вызове exec. Например

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() имеет найденный массив из выполнения запроса в качестве входных данных и отсортированного массива в качестве выхода. Это может быть, например, примерно так:

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; 
} 

Этот алгоритм сортировки является лишь иллюстрацией того, как сортировка может быть выполнена. Конечно, вы должны сами написать собственный алгоритм. Помните, что результатом запроса является массив, который вы можете манипулировать по своему усмотрению. array.sort() - твой друг. Вы можете сообщить об этом here.

Смежные вопросы