0

我正在尝试更新我收藏中的随机日期。
下面的代码使用相同的随机日期更新所有条目,我希望循环遍历所有条目并为每个条目提供不同的日期。

我设法使用索引使其工作。
索引大型数据集的最佳方法是什么?

$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)
    );
}
4

1 回答 1

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)
    );
}
于 2012-09-27T04:32:27.050 回答