我有一个商店列表,他们有一个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
答案 0 :(得分:1)
假设你的数据实际上是为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"中的指定字段,然后您在$sort
中使用该字段以及其他字段" usecount"如下所示,按最大值排列"最大的"如果" usecount"首先,并在每个" dist"已经排序。
尽管.aggregate()
聚合框架不仅仅是"聚合"文档。这是你的主要工具"用于将新值投影到文档中,对于按照"计算"通过一种方式或另一种方式。
与$near
(或$nearSphere
)不同,距离作为文档中的真实字段返回,而不仅仅是"默认"排序。这允许该键在排序结果中使用,以及在$sort
阶段呈现或投影到文档中的任何其他字段值。
另请注意,此处的数据似乎不是有效的球形坐标,这会导致GeoJSON存储问题,并且还会导致问题出现问题。\ n" 2dsphere"指数。如果不是真正的全球坐标,而是在#34;平面上的坐标,那么只需使用平面遗留阵列来实现" geo"作为[1333.222,222.222]
和" 2d"仅限索引。以及" near"在$geoNear
范围内,它也只是一个数组,并且是"球形"然后不需要选项。
但也可能是输入问题的问题。