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一致するコレクション内のすべてのレコードを更新します

したがって、実際の結果は、コレクション内のすべてのレコードに対してコレクションを 1 回反復し、コレクション内のすべてのエントリを の現在の値に更新することになります$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 に答える