2015-11-04 88 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