0

如何在 mongoDB 中按接近度和日期排序?我试过这个。但他们只是按日期排序:

   coll.find({'date':{$gte:date},'location':{$nearSphere:[lat,lng]}}).sort({'date':1}).execFind(function (err, docs) {})

我很感激帮助。

4

2 回答 2

6

没有直接的方法来使用$nearor$nearSphere并按另一个字段排序,因为这两个运算符都已经对执行 a 的结果进行了排序find()。当您再次按“日期”排序时,您正在重新排序结果。但是,您可以做的是从$nearSphere增量中获取结果,并对每组结果进行排序。例如:

function sortByDate(a, b) { return a.date - b.date; }

// how many results to grab at a time
var itersize = 10;
// this will hold your final, two-way sorted results
var sorted_results = new Array();
for (var i=0, last=db.coll.count(); i<last-itersize; i+=itersize) {
    var results = db.coll.find( {"date":{$gte:date},
                                 // longitude, then latitude
                                 "location":[lng, lat]} ).skip(i).limit(itersize).toArray();
    // do date sorting app-side for each group of nearSphere-sorted results
    sorted_results = sorted_results.concat( results.sort(sortByDate) );
}

您还应该注意在 mongodb 查询中指定地理空间坐标的顺序。MongoDB 使用geojson规范,它以 X、Y、Z 顺序(即经度、纬度)进行坐标。

于 2013-09-16T19:35:56.417 回答
1

建议在聚合中使用 $geoNear: https ://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/

您可以对日期和距离进行汇总排序:

    coll.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ lng, lat ] },
        key: "location",
        spherical: true,
        distanceField: "dist.calculated",
        query: { "date": {"$gte": date} }
     }
   },
   {$sort: {"dist.calculated":1, "date": 1}}
])
于 2018-07-27T13:28:03.310 回答