2016-11-03 10 views
0

MongoDB用のmongooseを使って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()関数はlimit関数のように完全に機能します。私の問題は並べ替えとスキップです。ソートやスキップが無視されるような感じです。私はmongoとmongooseのドキュメントと同様のコードをオンラインで見てきました。どこでも修正を見つけることはできません。特定の地域で文書を取得しようとすると、結果が適切にスキップされ、日付順に整理されるように、どうすればよいですか?次へ

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

+0

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

+0

@Molda私は彼がマングースのクエリではなく凝集をやろうとしていると思います。 http://mongoosejs.com/docs/api.html#model_Model.geoNear – dyouberg

+0

@dyoubergの質問にリンクしています。スキップはgeoでサポートされていないと言われていますが、代わりに集約を使用できます。私はマングースにあまり慣れていないので間違っているかもしれません。 – 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

これを変更してみてください

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は関数ではありません」と言ったエラーを出し続けました。最初に置かれたもの(並べ替え、スキップ、リミット、またはexec)に関係なく、関数ではなくエラーが発生し続けました – TheNewGuy

+0

Ehh @Moldaのコメントで集約ルートを下ろさなければならない可能性があります。 – dyouberg

+0

集計を使用すると、プロセスは機能します。以下に掲載された作業コード。ありがとうございました。 – TheNewGuy

関連する問題