2012-11-30 95 views
0

我有一個叫Reports要被處理的集合中的文檔。我做一個查詢,如MongoDB的PHP findAndModify多性能

$collectionReports->find(array('processed' => 0)) 

(50至2000項之間的任何地方)。我處理它們是如何處理的,並將結果插入到另一個集合中,但我需要更新原始報告以將處理設置爲當前系統時間。現在它看起來像這樣:

$reports = $collectionReports->find(array('processed' => 0)); 
$toUpdate = array(); 
foreach ($reports as $report) { 
    //Perform the operations on them now 
    $toUpdate = $report['_id']; 
} 
foreach ($toUpdate as $reportID) { 
    $criteria = array('_id' => new MongoId($reportID)); 
    $data = array('$set' => array('processed' => round(microtime(true)*1000))); 
    $collectionReports->findAndModify($criteria, $data); 
} 

我的問題是,它是非常低效率。處理報告並將它們插入到集合中對於2000年的報告可能需要700ms,但只是更新處理的時間對於那些相同的2000報告至少需要1500ms。任何提示加快速度?提前致謝。

編輯:處理時間並沒有準確的說,它可以只是腳本運行(+/- 10秒左右)的時候,如果有可能採取的對象($報告)並像這樣直接更新時間,那會比在第一個foreach之後搜索更好。

+0

爲什麼要使用findandmodify在這裏?你沒有利用它提供的任何東西。 – Sammaye

+0

我對Mongo還很陌生,在這裏使用的正確函數是什麼? – Ahorner

+1

我會說沒有,只是用普通的'更新()',看看是否有更好的東西入手 – Sammaye

回答

0

感謝Sammaye,從findAndModify改變()來更新()似乎更好,更快的工作。

+0

只是爲了未來搜索的更新:更新是在這種情況下確實比較好。然而,findAndModify的長執行時間表明你的查詢沒有被索引......嘗試通過find()運行相同的查詢並在末尾添加explain()來查看掃描記錄的數量(應該是最小的),它使用的索引。 – johndodo