2016-11-03 31 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

相关问题