0

我有两个集合,如下:

db.ships
文档格式:{ mmsi: Long, ... some other fields }
索引:{ {mmsi: 1}, {unique: true} }

db.navUpdates
文档格式:{ mmsi: Long, time: ISODate, ... some other fields }
索引:{ mmsi: 1 }, { time: 1 }

对于 中的每个文档,我需要找到匹配的db.ships最新文档。我不能用来查找最新的文档,因为文档不一定按时间顺序(由时间戳定义)输入。db.navUpdatesmmsi_idtime

例如:

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") }

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

我尝试了以下 mongo shell 脚本,但速度非常慢(仅 10 个查询需要几秒钟),并且出现在服务器上的消息表明我缺少 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文件的mmsis 不在navUpdates.

4

1 回答 1

2

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

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

于 2012-09-19T21:08:34.037 回答