首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo用另一种二级排序命令一个$near

Mongo用另一种二级排序命令一个$near
EN

Stack Overflow用户
提问于 2015-09-04 12:12:35
回答 1查看 907关注 0票数 4

我有一个商店的清单,他们有一个useCount和地理位置。我将如何通过useCount进行搜索和排序,但在返回的每个对象上都有一个属性,表示它们与我的距离有多近。

模式:

代码语言:javascript
复制
{
    name: String,
    useCount: { type: Number, index: true },
    location: { 'type': {type: String, enum: "Point", default: "Point"}, coordinates: { type: [Number],   default: [0,0]} }
}

例如,结果

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2015-09-04 12:27:01

假设您的数据实际上是为MongoDB安排的,如下所示:

代码语言:javascript
复制
{
    "shop": 1,
    "usecount": 12,
    "closest": 3,
    "geo": {
        "type": "Point",
        "coordinates": [1333.222,222.222]
    }
}

而且您的坐标实际上是按照GeoJSON和MongoDB所要求的“经度/纬度”顺序,并且您有一个地理空间索引,即"2dsphere“,那么“复合排序”的最佳选项是使用$geoNear聚合命令管道,以及聚合$sort

代码语言:javascript
复制
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中“接近”的参数也只是一个数组,这样就不需要使用“球形”选项。

但在你的问题中输入可能也有问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32397786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档