2012-09-27 24 views
0

我試圖更新我的收藏中的隨機日期。
下面的代碼是更新具有相同隨機日期的所有條目,我希望循環遍歷所有條目,併爲每個條目給出不同的日期。

我設法讓它使用索引工作。
索引大型數據集的最佳方法是什麼?mongodb php更新所有條目的隨機日期索引

$date_1 = strtotime(date('Y-m-d H:i:s')); 
$date_2 = strtotime("2012-07-26 09:00:00"); 

$m = new Mongo(); 
$db = $m->comedy; 
$collection = $db->cartoons; 

$cursor = $collection->find(); 

$query = array('_id'=>array('$exists' => true)); 

foreach ($cursor as $obj){ 
    $randomDate = rand($date_1,$date_2); 

    $collection->update(
     $query, 
     array('$set' => array("ts"=> new MongoDate($randomDate))), 
     array('multiple' => true) 
    ); 
} 

編輯:

foreach ($cursor as $obj){ 
    $randomDate = rand($date_1,$date_2); 
    $id = $obj["_id"]; 
    $collection->update(
     array('_id'=> $id), 
     array('$set' => array("ts"=> new MongoDate($randomDate))), 
     array('multiple' => true) 
    ); 
} 

回答

0

上指數的最好辦法答案真的取決於你如何通常要查詢的數據。您需要添加適當的索引以提高查詢性能。

針對您的特殊的代碼示例,問題是,你遍歷集合,而是通過一個通用的$query通過將匹配整個集合:

$query = array('_id'=>array('$exists' => true)); 

你逝去的'multiple' => true將更新每記錄在匹配的集合中。

因此,實際結果將是爲集合中的每個記錄迭代一次集合,將集合中的所有條目更新爲當前值$randomDate

校正環路將類似於:

foreach ($cursor as $obj) { 
    $randomDate = rand($date_1, $date_2); 
    $collection->update(
     array('_id'=> $obj->['_id']), 
     array('$set' => array('ts' => new MongoDate($randomDate))), 
     array('multiple' => false) 
    ); 
}