如何在Mongoose

时间:2017-01-03 22:57:39

标签: node.js mongodb sorting mongoose

我正在使用Mongoose开发一个小型NodeJS Web应用程序来访问我的MongoDB数据库。我的收藏的简化模式如下:

var MySchema = mongoose.Schema({                                 
    content:   { type: String },     
    location:  {                                                        
         lat:      { type: Number },                       
         lng:      { type: Number },                                              
    },
    modifierValue:  { type: Number }     
});

不幸的是,我无法以对我来说更方便的方式对服务器中检索到的数据进行排序。我希望根据它们与给定位置(位置)的距离对结果进行排序,但要考虑具有 modifierValue 的修饰符函数,该函数也被视为输入。< / p>

我打算做的事情如下。但是,这种排序功能似乎不存在。

MySchema.find({})
        .sort( modifierFunction(location,this.location,this.modifierValue) )
        .limit(20)       // I only want the 20 "closest" documents
        .exec(callback)

mondifierFunction返回Double。

到目前为止,我已经研究了使用mongoose的$ near函数的可能性,但这似乎没有排序,不允许修饰函数。

由于我是node.js和mongoose的新手,我可能对我的问题采用了一种完全错误的方法,所以我愿意完全重新设计我的编程逻辑。

提前谢谢你,

1 个答案:

答案 0 :(得分:3)

你可能已经在问题日期找到了答案,但无论如何我都会回答。

对于更高级的排序算法,您可以在exec回调中进行排序。例如

MySchema.find({})
  .limit(20)
  .exec(function(err, instances) {
      let sorted = mySort(instances); // Sorting here

      // Boilerplate output that has nothing to do with the sorting.
      let response = { };

      if (err) {
          response = handleError(err);
      } else {
          response.status = HttpStatus.OK;
          response.message = sorted;
      }

      res.status(response.status).json(response.message);
  })

mySort()将查询执行中找到的数组作为输入,将排序后的数组作为输出。例如,它可能是这样的

function mySort (array) {
  array.sort(function (a, b) {
    let distanceA = Math.sqrt(a.location.lat**2 + a.location.lng**2);
    let distanceB = Math.sqrt(b.location.lat**2 + b.location.lng**2);

    if (distanceA < distanceB) {
      return -1;
    } else if (distanceA > distanceB) {
      return 1;
    } else {
      return 0;
    }
  })

  return array;
}

这种排序算法只是说明如何进行排序。你当然必须自己编写适当的算法。请记住,查询的结果是一个可以根据需要操作的数组。 array.sort()是你的朋友。您可以获得有关它的信息here