2016-11-03 36 views
0

我正在使用mongoose for MongoDB開發Express API。在下面的代碼中,我試圖找到距離特定距離內的GeoJson對象,對它們進行排序,以便最先出現的對象首先出現,然後在返回「限制」中指定數量的對象之前跳到某個文檔。如何解決MongooseJS排序和跳過

// Find all of the stacks in a given radius 
router.param("range", function(req, res, next, range) { 
    if(range === "1") { 
    var radius = 8125; // Meters. (5 Miles) 
    } else if(range === "0") { 
    var radius = 45.75; // Meters. (150 Feet) 
    } 

    var skipTo = parseInt(req.params.skip); 
    var origin = [parseFloat(req.params.lon), parseFloat(req.params.lat)]; // [longitude, latitude] 
    var userLocation = { type: "Point", coordinates: origin }; 
    var options = { maxDistance: radius, 
        spherical : true, 
        sort: { 
        createdAt: -1 // Sort by Date Added DESC 
        }, 
        skip: skipTo, // Skip to a specific point 
        limit: 15 // How many returned 
       }; 

    Stack.geoNear(userLocation, options, function(err, result, stats) { 
    if(err) return next(err); 

    if(!result) { 
     err = new Error("Not Found"); 
     err.status = 404; 
     return next(err); 
    } 

    req.locals = result; 
    next(); 
    }); 
}); 

當我運行代碼時,geoNear()函數與限制函數完全一樣工作。我的問題是排序和跳過。這幾乎就像忽略了排序和跳過一樣。我在網上查看了mongo和mongoose文檔以及類似的代碼,我無法在任何地方找到修復程序。我怎樣才能做到這一點,以便當我試圖獲取某個區域的文檔時,我的結果會被正確跳過並按日期組織?

+0

可能重複http://stackoverflow.com/q/24297556/3284355 – Molda

+0

@Molda我想他正試圖做一個貓鼬的查詢,而不是聚集。 http://mongoosejs.com/docs/api.html#model_Model.geoNear – dyouberg

+0

@dyouberg在問題中,我把他們說跳過在geoNear中不支持,可以使用聚合。我不太熟悉貓鼬,所以我可能是錯的。 – Molda

回答

0

我昨天解決了這個問題。該代碼發佈如下。

// Find all of the stacks in a given radius 
router.param("range", function(req, res, next, range) { 

if(range === "1") { 
    var radius = 8125; // Meters. (5 Miles) 
    } else if(range === "0") { 
    var radius = 45.75; // Meters. (150 Feet) 
    } 

    var skipTo = parseInt(req.params.skip); 
    var origin = [parseFloat(req.params.lon), parseFloat(req.params.lat)]; // [longitude, latitude] 
    var userLocation = { type: "Point", coordinates: origin }; 
    var options = { maxDistance: radius, 
        spherical: true, 
        limit: 15 // How many returned 
       }; 

    // Query database for Stack Objects 
    Stack.aggregate([ 
    { '$geoNear': { 
     'near': userLocation, // The point where the user is located 
     'distanceField': 'dist.calculated', // The distance the Stack Object is from the user 
     'maxDistance': radius, // The furthest distance a Stack Object can be from the user 
     'spherical': true 
     } 
    }, 
    { '$sort': { 'createdAt': -1 } }, // Return newest Stack Object first 
    { '$skip': skipTo }, // Paginate 
    { '$limit': 15 } // Number of Stacks returned 
    ]).exec(function(err, result, stats) { 
    if(err) return next(err); 

    if(!result) { 
     err = new Error("No Stacks Found"); 
     err.status = 404; 
     return next(err); 
    } 

    req.locals = result; 
    next(); 
    }); 
}); 
0

你可以嘗試改變這一點:

Stack.geoNear(userLocation, options, function(err, result, stats) { 

以下幾點:

var options = { maxDistance: radius, spherical : true }; 

Stack.geoNear(userLocation, options) 
    .sort({CreatedAt: -1}) 
    .skip(skipTo) 
    .limit(15) 
    .exec(function(err, result, stats) { 

我覺得排序,跳過和限制需要被調用的選項而不是直接指定。

+0

我最初嘗試過。我不斷收到一個錯誤,說「geoNear(...)。sort不是一個函數」,無論先放什麼(排序,跳過,限制或可執行文件),我總是收到一個錯誤,說它不是函數 – TheNewGuy

+0

Ehh值得一試 - 可能不得不在@Molda的評論 – dyouberg

+0

的聚合路線下。當我使用聚合時,你的過程起作用。工作代碼發佈如下。謝謝。 – TheNewGuy

相關問題