【问题标题】:Geonear sort by distance and timeGeonear 按距离和时间排序
【发布时间】:2015-10-07 03:25:21
【问题描述】:

我有以下数据:

{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a22"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T08:50:02.892Z"),
    "palce" : "aa",
    "sex" : 1,
    "longdis" : 1,
    "location" : [ 106.607312, 29.575281 ]
}
{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a24"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T08:50:02.920Z"),
    "palce" : "bbb",
    "sex" : 1,
    "longdis" : 1,
    "location" : [ 106.589896, 29.545098 ]
}
{
    "_id" : ObjectId("55a8c1ba3996c909184d7a25"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T08:50:02.922Z"),
    "palce" : "ccc",
    "sex" : 1,
    "longdis" : 1,
    "location" : [ 106.590758, 29.566713 ]
}
{
    "_id" : ObjectId("55a8c1ba3996c909184d7a26"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T08:50:02.923Z"),
    "palce" : "ddd",
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.637039, 29.561436 ]
}
{
    "_id" : ObjectId("55a8c1bc3996c909184d7a27"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T08:50:04.499Z"),
    "palce" : "eee",
    "sex" : 1,
    "longdis" : 1,
    "location" : [ 106.539522, 29.57929 ]
}
{ 
    "_id" : ObjectId("55a8d12e78292fa3837ebae4"),
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639",
    "createdate" : ISODate("2015-07-17T09:55:58.947Z"),
    "palce" : "fff",
    "sex" : 1,
    "longdis" : 1,
    "location" : [ 106.637039, 29.561436 ]
}

我想首先按距离排序,如果距离相同,按时间排序。

我的命令:

db.runCommand( { 
   geoNear: "paging", 
   near: [106.606033,29.575897 ],
   spherical : true,
   maxDistance : 1/6371,
   minDistance:0/6371,
   distanceMultiplier: 6371,
   num:2,
   query: {'_id': {'$nin': []}} 
})

db.paging.find({
   'location':{
       $nearSphere: [106.606033,29.575897],
       $maxDistance:1
   }
}).limit(5).skip((2 - 1) * 2).sort({createdate:-1})

如何同时对“最近”和“创建日期”进行排序?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    此处使用的正确查询使用具有$geoNear 管道阶段的aggregation framework 来协助此操作。这也是您可以通过多个键“排序”的唯一地方,因为不幸的是,“地理空间”$nearSphere 没有像$text 这样的“距离”的“元”投影有一个“分数”。

    您正在使用的geoNear 数据库命令也不能以这种方式与“光标”.sort() 一起使用。

    db.paging.aggregate([
        { "$geoNear": {
            "near": [106.606033,29.575897 ],
            "spherical": true,
            "distanceField": "distance",
            "distanceMuliplier": 6371,
            "maxDistance": 1/6371
        }},
        { "$sort": { "distance": 1, "createdate": -1 } },
        { "$skip": ( 2-1 ) * 2 },
        { "$limit": 5 }
    ])
    

    这等同于您正在尝试做的事情。

    使用聚合框架,您可以使用"pipeline operators" 而不是“光标修饰符”来执行$sort$skip$limit 之类的操作。此外,这些必须按逻辑顺序排列,而游标修饰符通常可以解决。

    它是一个“管道”,就像“Unix 管道”一样。 |

    另外,请注意“maxDistance”和“distanceMuliplier”。由于您的坐标采用“传统坐标对”而不是GeoJSON 格式,因此距离以“弧度”测量。如果您有 GeoJSON 存储的位置数据,则结果以“米”返回。

    【讨论】:

    • 用户跟随命令不起作用:db.paging.aggregate([ { "$geoNear": { "near": [106.606033,29.575897 ], "spherical": true, "distanceField": "distance ", "distanceMuliplier": 6371, "maxDistance": 1/6371 }}, { "$sort": { "distance": 1, "createdate": -1 }, { "$skip": (2-1) * 2 }, { "$limit": 5 } ]) 如果删除 "{ "$sort": { "distance": 1, "createdate": -1 }," 就可以了。
    • @user2968187 我输入错误。在$sort 舞台上错过了结束}。现已修复。
    • @user2968187 去玩,玩得开心。就像我说的那样,在这种情况下,聚合是实现多个排序标准的唯一真正方法。完成后别忘了accept
    • 但是使用聚合性能不好,看这个:emptysqua.re/blog/paging-geo-mongodb
    • @user2968187 不要相信“炒作”。而且您正在阅读错误的部分。聚合本身并不坏,它是“跳过”和“限制”,就像普通的 .skip().limit() 一样,对于性能不好。但这也“不是你的问题”。如果您对“分页性能”还有其他问题,请发布该问题,因为它本身需要一个详细的答案。这里的“性能”与您尝试的示例没有任何不同。唯一的区别在于它确实有效。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2018-08-07
    • 2018-11-18
    • 2013-11-11
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多