为什么这个mongodb查询这么慢?

时间:2012-09-19 20:46:01

标签: mongodb indexing

我有两个集合,如下所示:

db.ships
文件格式:{mmsi:长,......其他一些领域} 索引:{{mmsi:1},{unique:true}}

db.navUpdates
文件格式:{mmsi:长,时间:ISODate,...其他一些字段}
索引:{mmsi:1},{time:1}

对于db.ships中的每个文档,我需要在db.navUpdates中找到与mmsi匹配的最新文档。我无法使用_id查找最近的文档,因为文档不一定按时间顺序(按时间戳time)的顺序输入。

E.g:

ship document:
{ mmsi: 12345 }

navUpdate documents:
{ mmsi: 12345, time: ISODate("2012-09-19T12:00:00.000Z") }
{ mmsi: 12345, time: ISODate("2012-09-18T12:00:00.000Z") }
{ mmsi: 54321, time: ISODate("2012-09-19T12:00:00.000Z") }

因此对于ship mmsi:12345navUpdate是上面列表中的第一个文档time:ISODate("2012-09-19T12:00:00.000Z")

我尝试了以下mongo shell脚本,但速度非常慢(仅10个查询需要多秒),messages appearing on the server indicate I'm missing an index

db.ships.find().limit(10).forEach(function(ship) {
    var n = db.navUpdates.find({mmsi:ship.mmsi}).count();
    if (n==0) { return; }
    var t = db.navUpdates.find({mmsi:ship.mmsi}).sort({time:-1}).limit(1)[0].time;
    print(t);
});

为什么这个查询这么慢?我尝试向{time: -1}添加navUpdate索引,可能认为sort({time: -1})可能是罪魁祸首,但仍然没有改进。

此外,可以优化此查询吗?我在那里进行了count()调用,因为有ship个文档在mmsi内找不到navUpdates个。

1 个答案:

答案 0 :(得分:2)

单个查询只能使用一个索引,因此您应该将{ mmsi: 1, time: -1 }的复合索引添加到navUpdates,这可以用于查找和排序需求。

然后使用.explain()确定您的索引是否在查询中使用。