我有两个集合,如下所示:
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:12345
,navUpdate
是上面列表中的第一个文档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
个。
答案 0 :(得分:2)
单个查询只能使用一个索引,因此您应该将{ mmsi: 1, time: -1 }
的复合索引添加到navUpdates
,这可以用于查找和排序需求。
然后使用.explain()
确定您的索引是否在查询中使用。