(PECL mongo >=0.9.0)
MongoCollection::update — 指定した条件にもとづいてレコードを更新する
更新したいオブジェクトの条件。
マッチするレコードを更新するオブジェクト。
このパラメータは array("optionname" => <boolean>, ...) 形式の連想配列で、現在サポートしているオプションは次の通りです。
"upsert"
$criteria にマッチするレコードが見つからない場合に $criteria と $newobj から新しいオブジェクトを作ります (以下の upsert の例を参照ください)。
"multiple"
$criteria にマッチするすべてのドキュメントを更新します。 MongoCollection::update() は MongoCollection::remove() と正反対の動きをします。 デフォルトでは、マッチするすべてのドキュメントではなく ひとつのドキュメントだけを更新するのです。 複数ドキュメントを更新したいのかそうでないのかは、 常に指定しておくことを推奨します。 将来、データベースのデフォルトの挙動が変わる可能性があるからです。
"safe"
更新が成功したかどうかを確認します。
更新のデータベースへの送信が成功したかどうかを返します。
"safe" オプションが設定されているときに更新に失敗した場合は、 MongoCursorException をスローします。
バージョン | 説明 |
---|---|
1.0.1 | "options" パラメータが boolean から配列に変わりました。 1.0.1 より前のバージョンでは二番目のパラメータはオプションの boolean 値で、upsert を指定するものでした。 |
1.0.5 | "safe" オプションが追加されました。 |
例1 MongoCollection::update()
address フィールドをドキュメントに追加します。
<?php
$c->insert(array("firstname" => "Bob", "lastname" => "Jones" ));
$newdata = array('$set' => array("address" => "1 Smith Lane"));
$c->update(array("firstname" => "Bob"), $newdata);
var_dump($c->findOne(array("firstname" => "Bob")));
?>
上の例の出力は、 たとえば以下のようになります。
array(4) { ["_id"]=> object(MongoId)#6 (0) { } ["firstname"]=> string(3) "Bob" ["lastname"]=> string(5) "Jones" ["address"]=> string(12) "1 Smith Lane" }
例2 MongoCollection::update() での upsert
upsert を使うとコードを簡潔にすることができます。 オブジェクトが存在しない場合は新たに作成し、 存在する場合はそれを更新するという操作を一行で書けるからです。
<?php
$c->drop();
$c->update(array("uri" => "/summer_pics"), array('$inc' => array("page hits" => 1)), array("upsert" => true));
var_dump($c->findOne());
?>
上の例の出力は、 たとえば以下のようになります。
array(3) { ["_id"]=> object(MongoId)#9 (0) { } ["uri"]=> string(12) "/summer_pics" ["page hits"]=> int(1) }
例3 MongoCollection::update() での複数更新
デフォルトでは MongoCollection::update() は、 $criteria にマッチするドキュメントが複数見つかっても最初のものだけを更新します。 必要なら、"multiple" オプションでその挙動を変えることができます。
この例は、翌日が誕生日である全員に "gift" フィールドを追加します。
<?php
$today = array('$gt' => new MongoDate(), '$lt' => new MongoDate(strtotime("+1 day")));
$people->update("birthday" => $today), array('$set' => array('gift' => $surprise), array("multiple" => true));
?>
MongoDB コアドキュメントの » update を参照ください。