2015-11-04 93 views
1

我有一个查询通过优先级标记的日志条目。

db.logs.find({ 
    environment: "production", 
    priority: { 
     $in: ["debug", "info"] 
    } 
}).sort({ 
    timestamp: -1 
}) 

这个系列现在已经结束3GB和这些查询都是向上走的45秒返回。

查询,如下面还是回到下第二:

db.logs.find({ 
    environment: "production", 
    priority: "info" 
}).sort({ 
    timestamp: -1 
}) 

看来,我的指标没有做任何事情来帮助。这是我试过的:

{ "_id" : 1} 
{ "timestamp" : -1} 
{ "priority" : 1 , "timestamp" : -1} 
{ "environment" : 1 , "timestamp" : -1} 
{ "environment" : 1 , "priority" : 1 , "timestamp" : -1} 

这些似乎都没有帮助我。有什么方法可以基于分组创建索引吗? (即,所有消息的索引priority: { $in: ["foo", "bar", "bin"] }

回答

1

This excellent blog post解释你的确切场景。基本上索引是独立排序第一个然后使用您的索引。要使用范围查询($in),您应该按相反的顺序执行索引:{timestamp: -1, priority: 1}

还使用.explain来查看您的查询正在做什么。使用scanAndOrder: true它必须对集合进行全面扫描,并尝试在需要很长时间的内存中排序。

+0

你是一个拯救生命的人,谢谢!有一段时间,我一直在对着这个墙壁敲打我的头...... – mikegreiling