我使用的是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查询可能有问题?
答案 0 :(得分:3)
正如@JuanMendes
在评论中所说,第一个sort
然后应用limit
,这意味着MongoDB会对所有数十亿个文档进行排序并返回24个文档。在第二个中,您只从MongoDB获取24个文档,并使用javascript
排序对它们进行排序。所以区别在于本机javascript排序和MongoDB排序之间。区别在于对24个文档进行排序和对数十亿个文档进行排序
sort
和limit
的顺序无关紧要。在应用sort
之前,MongoDB总是limit
。见this