为什么Mongoose排序比本机javascript排序慢?

时间:2017-03-03 11:24:43

标签: javascript node.js mongodb sorting mongoose

我使用的是Node.js 6.10.0和Mongoose 4.8.5。实际上,我试图从坐标和某个日期时间找到最近的坐标。我有数十亿的数据进入我的MongoDB。我想对我的查询应用排序,因为我想按日期时间排序

(2017-03-02T03: 00:00.000 Z,2017-03-02T03: 01:00.000 Z ... 2017 -03-02T03:的 23:00.000 Z)

所以这是我用Mongoose排序的查询:

var condition = {
    $nearSphere: {
       $geometry: {
          type : "Point",
          coordinates : [2.2871244564, 47.930476456445]
       }
   }
};

var date_condition = {
   $gte: new Date('2017-03-02'),
   $lt: new Date('2017-03-03')
};

var selected_fields = '-_id loc datetime';

console.time('find')
var query = Model.find({loc: condition, datetime: date_condition}, selected_fields)
                 .limit(24)
                 .sort({date: 'asc'})
                 .exec();

query.then(function(docs){
    var json = {};
    json.data = docs;
    console.timeEnd('find')
    res.json(json);
});

这里使用本机排序轻松进行相同的查询:

console.time('find')
var query = Model.find({loc: condition, datetime: date_condition}, selected_fields)
                 .limit(24)
                 .exec();

query.then(function(docs){
    var json = {};
    docs.sort(function(a, b) {
        return new Date(a.datetime) - new Date(b.datetime);
    });
    json.data = docs;
    console.timeEnd('find')
    res.json(json);
});

然后使用Mongoose排序,请求需要 8000 - 10000 MS 。 对于本机排序,请求只需 15 MS

你能告诉我为什么本地排序比Mongoose排序更好吗?或者我的Mongoose查询可能有问题?

1 个答案:

答案 0 :(得分:3)

正如@JuanMendes在评论中所说,第一个sort然后应用limit,这意味着MongoDB会对所有数十亿个文档进行排序并返回24个文档。在第二个中,您只从MongoDB获取24个文档,并使用javascript排序对它们进行排序。所以区别在于本机javascript排序和MongoDB排序之间。区别在于对24个文档进行排序和对数十亿个文档进行排序

sortlimit的顺序无关紧要。在应用sort之前,MongoDB总是limit。见this