【问题标题】:Mongo ordering a $near with another secondary sortMongo 用另一个二级排序来订购 $near
【发布时间】:2015-11-30 14:18:36
【问题描述】:

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

【问题讨论】:

  • 这在数据中看起来很像 SQL,而不像 MongoDB。您的数据实际上是什么样的?您尝试过什么?

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


【解决方案1】:

假设您的数据实际上是为 MongoDB 正确安排的,看起来像这样:

{
    "shop": 1,
    "usecount": 12,
    "closest": 3,
    "geo": {
        "type": "Point",
        "coordinates": [1333.222,222.222]
    }
}

您的坐标实际上是 GeoJSON 和 MongoDB 所要求的“经度/纬度”顺序,并且您的地理空间索引为 "2dsphere",那么“复合排序”的最佳选择是使用 @987654322 @聚合命令管道,连同聚合$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 存储和“2dsphere”索引出现问题。如果不是真正的全局坐标而是“平面”上的坐标,那么只需将“geo”的平面遗留数组用作[1333.222,222.222] 和“2d”索引。同样$geoNear 中“near”的参数只是一个数组也是如此,因此不需要“球形”选项。

但也可能在输入您的问题时出现问题。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2020-08-09
    • 2021-12-12
    • 2011-03-31
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多