Mongo使用另一种次要排序订购$ near

时间:2015-09-04 12:12:35

标签: mongodb mongoose geolocation mongodb-query aggregation-framework

我有一个商店列表,他们有一个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

1 个答案:

答案 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范围内,它也只是一个数组,并且是"球形"然后不需要选项。

但也可能是输入问题的问题。