Geonear按距离和时间排序

时间:2015-07-17 11:54:40

标签: mongodb mongodb-query aggregation-framework

我有以下数据:

{ 
    "_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})

如何对最近的"最近的"和" createddate"?

1 个答案:

答案 0 :(得分:5)

此处使用的正确查询使用具有aggregation framework管道阶段的$geoNear来协助解决此问题。它也是你到达的唯一的地方"排序"通过多个键,不幸的是地理空间"地理空间" $nearSphere没有" meta"预测"距离"像$text一样有"得分"。

您正在使用的geoNear数据库命令也不能与" cursor"一起使用。这样.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"和#34; distanceMuliplier"。由于您的坐标属于"遗留坐标对"而不是GeoJSON格式,则距离以"弧度"来衡量。如果您有GeoJSON存储的位置数据,则结果将在"米"中返回。