我正在使用Mongoose开发一个小型NodeJS Web应用程序来访问我的MongoDB数据库。我的收藏的简化模式如下:
var MySchema = mongoose.Schema({
content: { type: String },
location: {
lat: { type: Number },
lng: { type: Number },
},
modifierValue: { type: Number }
});
不幸的是,我无法以对我来说更方便的方式对服务器中检索到的数据进行排序。我希望根据它们与给定位置(位置)的距离对结果进行排序,但要考虑具有 modifierValue 的修饰符函数,该函数也被视为输入。< / p>
我打算做的事情如下。但是,这种排序功能似乎不存在。
MySchema.find({})
.sort( modifierFunction(location,this.location,this.modifierValue) )
.limit(20) // I only want the 20 "closest" documents
.exec(callback)
mondifierFunction返回Double。
到目前为止,我已经研究了使用mongoose的$ near函数的可能性,但这似乎没有排序,不允许修饰函数。
由于我是node.js和mongoose的新手,我可能对我的问题采用了一种完全错误的方法,所以我愿意完全重新设计我的编程逻辑。
提前谢谢你,
答案 0 :(得分:3)
你可能已经在问题日期找到了答案,但无论如何我都会回答。
对于更高级的排序算法,您可以在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。