データベースサーバに接続するには、次のいずれかの方法を使います。
<?php
$connection = new Mongo(); // localhost:27017 に接続します
$connection = new Mongo( "example.com" ); // リモートホスト (デフォルトのポート) に接続します
$connection = new Mongo( "example.com:65432" ); // リモートホストの指定したポートに接続します
?>
データベースを選択するには次のようにします。
<?php
$db = $connection->dbname;
?>
<?php
$db = $connection->mybiglongdbname;
// 何かをします
$db = $connection->mybiglongdbnme;
// これは別のデータベースに接続してしまいます!
?>
コレクションの取得は、データベースの取得と同じ構文で行えます。
<?php
$db = $connection->baz;
$collection = $db->foobar;
// あるいは、もうすこし簡潔に
$collection = $connection->baz->foobar;
?>
連想配列は、データベース内のコレクションに保存できる基本的なオブジェクトです。 何らかの "ドキュメント" はこのような形式になります。
<?php
$doc = array( "name" => "MongoDB",
"type" => "database",
"count" => 1,
"info" => (object)array( "x" => 203,
"y" => 102),
"versions" => array("0.9.7", "0.9.8", "0.9.9")
);
?>
ドキュメントを追加するには MongoCollection::insert() を使います。
<?php
$m = new Mongo();
$collection = $m->foo->bar;
$collection->insert( $doc );
?>
追加したドキュメントがそこにあることを表示して確かめるには、 findOne() を使ってコレクション内の最初のドキュメントを取得します。 このメソッドは単一のドキュメントを返します (一方、 MongoCollection::find() は MongoCursor を返します)。 クエリにマッチするドキュメントがひとつしかない場合や ひとつの結果だけを知りたい場合に便利です。
<?php
$obj = $collection->findOne();
var_dump( $obj );
?>
array(5) { ["_id"]=> object(MongoId)#6 (0) { } ["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 フィールドが自動的にドキュメントに追加されたことに注目しましょう。 MongoDB は、_ と $ で始まる要素名を 内部的な動作のために予約しています。
もう少し意味のある問い合わせをするために、複数のシンプルなドキュメントをコレクションに追加しましょう。 これから追加するドキュメントは次のようなものです。
<?php
array( "i" => value );
?>
<?php
for($i=0; $i<100; $i++) {
$collection->insert( array( "i" => $i ) );
}
?>
先ほどと同じコレクションに、別のキーを持つ配列を追加していることに注目しましょう。 MongoDB が「スキーマフリー」であると言われるのは、こういう側面があるからです。
これで 101 件のドキュメントを追加したことになります (先ほどのループで 100 件、そして最初の 1 件)。 本当にそうなっているか、count() メソッドで確認してみましょう。
<?php
echo $collection->count();
?>
MongoCollection::count() には、クエリとフィールドを渡すこともできます。また、 MongoCursor (以下を参照) の数を数えることもできます。 この場合、クエリで指定したフィルタを考慮して数えます。
コレクション内のすべてのドキュメントを取得するには MongoCollection::find() を使います。 find() メソッドは MongoCursor オブジェクトを返し、 これを使うとクエリにマッチしたドキュメントすべてに対する反復処理ができるようになります。 では、すべてのドキュメントを取得して表示させてみましょう。
<?php
$cursor = $collection->find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?>
クエリを作って find() メソッドに渡せば、 コレクション内のドキュメントのサブセットを取得することができます。 たとえば、"i" フィールドの値が 71 であるドキュメントを探したいときは、 このようにします。
<?php
$query = array( "i" => 71 );
$cursor = $collection->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
array(2) { ["_id"]=> object(MongoId)#6 (0) { } ["i"]=> int(71) ["_ns"]=> "testCollection" }
クエリを使って、コレクションからドキュメントのセットを取得することができます。 たとえば、"i" > 50 であるすべてのドキュメントを取得したい場合は次のようにします。
<?php
$query = array( "i" => array( '$gt' => 50 ) ); // '$gt' と、シングルクォートで囲んでいることに注意しましょう
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
<?php
$query = array( "i" => array( "\$gt" => 20, "\$lte" => 30 ) );
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
mongo.cmd = ":"
<?php
$query = array( "i" => array( ":gt" => 20, ":lte" => 30 ) );
?>
MongoDB はインデックスをサポートしています。コレクションにインデックスを追加するのは簡単です。 インデックスを作るには、対象となるフィールドと並び順を指定します。 並び順は、昇順 (1) あるいは降順 (-1) のいずれかです。 この例では、"i" フィールドの昇順でインデックスを作成しています。
<?php
$coll->ensureIndex( array( "i" => 1 ) ); // "i" にインデックスを作ります
$coll->ensureIndex( array( "i" => -1, "j" => 1 ) ); // "i" の降順、"j" の昇順でインデックスを作ります
?>
この例では、MongoDB への接続からオブジェクトの追加、 オブジェクトの問い合わせ、その結果の反復処理、そして接続の切断までを行っています。
<?php
// 接続
$m = new Mongo();
// データベースの選択
$db = $m->comedy;
$collection = $db->cartoons;
// 要素の追加
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
// 構造が違う別の要素の追加
$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);
// コレクション内のすべての内容の検索
$cursor = $collection->find();
// 結果の反復処理
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
// 切断
$m->close();
?>
結果は次のようになります。
Calvin and Hobbes XKCD