MongoCollection::findOne() によるドキュメントの検索

先ほどの例で追加したドキュメントを表示するには、 シンプルに MongoCollection::findOne() を実行してコレクションからドキュメントをひとつ取得します。 このメソッドは、クエリにマッチするドキュメントがひとつだけしかないときや 一件の結果にだけしか興味がない場合に便利です。

<?php
$connection 
= new MongoClient();
$collection $connection->database->collectionName;

$document $collection->findOne();
var_dump$document );
?>

上の例の出力は以下となります。

array(6) {
  ["_id"]=>
  object(MongoId)#8 (1) {
    ["$id"]=>
    string(24) "4e2995576803fab768000000"
  }
  ["name"]=>
  string(7) "MongoDB"
  ["type"]=>
  string(8) "database"
  ["count"]=>
  int(1)
  ["info"]=>
  array(2) {
    ["x"]=>
    int(203)
    ["y"]=>
    int(102)
  }
  ["versions"]=>
  array(3) {
    [0]=>
    string(5) "0.9.7"
    [1]=>
    string(5) "0.9.8"
    [2]=>
    string(5) "0.9.9"
  }
}

_id フィールドが 自動的にドキュメントに追加されていることに注目しましょう。 _id は、いわゆる「主キー」フィールドです。 ドキュメントにキーがなければ、ドライバが自動的に追加します。

自前で _id フィールドを指定する場合は、 コレクション内で一意になるようにしなければなりません。 例をごらんください。

<?php
$connection 
= new MongoClient();
$db $connection->database;

$db->foo->insert(array("_id" => 1));
// これは例外が発生します
$db->foo->insert(array("_id" => 1));

// こちらは別のコレクションなので大丈夫です
$db->bar->insert(array("_id" => 1));
?>

ドライバはデフォルトで、サーバーが書き込みを受け付けてから結果を返すことを保証します。 オプションでこの挙動をオフにすることもできます。その場合は、 array("w" => 0) を二番目の引数で渡します。 これは、データベース側での書き込み完了をドライバに待たせないことを意味します。 つまり、_id が重複していてもドライバは例外をスローしません。

参考

MongoCollection::findOne() に、 データの検索に関する詳細な情報があります。

MongoId には、一意な ID に関する詳細な説明があります。

書き込みのページでは、 安全な書き込みについてより詳しく扱っています。 また Write Concerns では、さまざまな Write Concern オプションについて解説します。