【问题标题】:How to fix MongooseJS sort and skip如何修复 MongooseJS 排序和跳过
【发布时间】:2017-03-17 11:36:18
【问题描述】:

我正在为 MongoDB 使用 mongoose 开发 Express API。在下面的代码中,我试图找到一定距离内的 GeoJson 对象,对它们进行排序,使最新的对象首先出现,在返回“限制”中指定数量的对象之前跳到某个文档。

// 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 函数一样完美。我的问题是排序和跳过。就好像 sort 和 skip 被忽略了一样。我在网上查看了 mongo 和 mongoose 文档以及类似的代码,但在任何地方都找不到修复程序。我怎样才能使当我尝试获取某个区域的文档时,我的结果会被正确地跳过并按日期组织?

【问题讨论】:

标签: javascript node.js mongodb sorting mongoose


【解决方案1】:

您可以尝试更改此设置吗:

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) {

我认为sort、skip、limit需要直接调用,而不是在options中指定。

【讨论】:

  • 我最初尝试过。我不断收到一条错误消息,说“geoNear(...).sort 不是一个函数”,无论放在第一位(排序、跳过、限制或执行)我一直收到一个错误,说它不是一个函数跨度>
  • 嗯,值得一试 - 可能不得不在 @Molda 的评论下沿着聚合路线走
  • 当我使用聚合时,您的流程有效。工作代码发布在下面。谢谢。
【解决方案2】:

我昨天解决了这个问题。代码贴在下面。

// 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();
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多