我有一个商店的清单,他们有一个useCount和地理位置。我将如何通过useCount进行搜索和排序,但在返回的每个对象上都有一个属性,表示它们与我的距离有多近。
模式:
{
name: String,
useCount: { type: Number, index: true },
location: { 'type': {type: String, enum: "Point", default: "Point"}, coordinates: { type: [Number], default: [0,0]} }
}例如,结果
shop1 usecount-12 closest-3 geo-1333.222,222.222
shop2 usecount-3 closest-1 geo-1333.222,222.222
shop3 usecount-1 closest-2 geo-1333.222,222.222发布于 2015-09-04 12:27:01
假设您的数据实际上是为MongoDB安排的,如下所示:
{
"shop": 1,
"usecount": 12,
"closest": 3,
"geo": {
"type": "Point",
"coordinates": [1333.222,222.222]
}
}而且您的坐标实际上是按照GeoJSON和MongoDB所要求的“经度/纬度”顺序,并且您有一个地理空间索引,即"2dsphere“,那么“复合排序”的最佳选项是使用$geoNear聚合命令管道,以及聚合$sort。
Model.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [1333.222,222.222]
},
"distanceField": "dist",
"spherical": true
}},
{ "$sort": { "dist": 1, "usecount": -1 } }
],
function(err,results) {
}
)其中,$geoNear在"dist“中将”value“作为指定字段,然后在$sort中使用"usecount”和另一个字段"usecount“,如下所示,如果首先”usecount“,然后在每个已经排序的"dist”中,按“最大”值降序。
但是.aggregate()的聚合框架所做的不仅仅是“聚合”文档。它是您将新值投影到文档中的“主要工具”,对于将结果按一种或另一种方法“计算”的值排序非常有用。
与$near (或$nearSphere )不同,距离在文档中作为真实字段返回,而不仅仅是“默认”排序顺序。这允许在排序结果中使用该键,以及在$sort阶段显示或投影到文档中的任何其他字段值。
还注意到这里的数据似乎不是有效的球面坐标,这将导致GeoJSON存储和"2dsphere“索引出现问题。如果不是真正的全局坐标,而是在“平面”上进行坐标,那么只需使用平面遗留数组作为"geo“作为[1333.222,222.222]和"2d”索引。此外,在$geoNear中“接近”的参数也只是一个数组,这样就不需要使用“球形”选项。
但在你的问题中输入可能也有问题。
https://stackoverflow.com/questions/32397786
复制相似问题