This is the 10gen-supported PHP driver for MongoDB.
Here's a quick code sample that connects, inserts documents, queries for documents, iterates through query results, and disconnects from MongoDB. There are more details on each step in the tutorial below.
<?php
// connect
$m = new Mongo();
// select a database
$db = $m->comedy;
// select a collection (analogous to a relational database's table)
$collection = $db->cartoons;
// add a record
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
// add another record, with a different "shape"
$obj = array( "title" => "XKCD", "online" => true );
$collection->insert($obj);
// find everything in the collection
$cursor = $collection->find();
// iterate through the results
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
?>
This would output:
Calvin and Hobbes XKCD
データベースサーバに接続するには、次のいずれかの方法を使います。
<?php
$connection = new Mongo(); // localhost:27017 に接続します
$connection = new Mongo( "example.com" ); // リモートホスト (デフォルトのポート) に接続します
$connection = new Mongo( "example.com:65432" ); // リモートホストの指定したポートに接続します
?>
The manual chapter on connecting covers different types of connections.
The API documentation on the Mongo class and Mongo::__construct() give a comprehensive look at all possible options with a number of examples.
データベースを選択するには次のようにします。
<?php
$db = $connection->dbname;
?>
<?php
$db = $connection->mybiglongdbname;
// 何かをします
$db = $connection->mybiglongdbnme;
// これは別のデータベースに接続してしまいます!
?>
The API documentation on the MongoDB class contains more information about database objects.
コレクションの取得は、データベースの取得と同じ構文で行えます。
<?php
$db = $connection->baz;
$collection = $db->foobar;
// あるいは、もうすこし簡潔に
$collection = $connection->baz->foobar;
?>
The API documentation on the MongoCollection class contains more information about collection objects.
連想配列は、データベース内のコレクションに保存できる基本的なオブジェクトです。 何らかの "ドキュメント" はこのような形式になります。
<?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
$collection->insert( $doc );
?>
The API documentation on MongoCollection::insert() contains more information about inserting data.
To show that the document we inserted in the previous step is there, we can do a simple MongoCollection::findOne() operation to get a single document from the collection. This method is useful when there only is one document matching the query or you are only interested in one result.
<?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" } }
Note the _id field has been added automatically to your document. _id is the "primary key" field that is automatically populate for almost all documents in MongoDB.
The API documentation on MongoCollection::findOne() contains more information about finding data.
もう少し意味のある問い合わせをするために、複数のシンプルなドキュメントをコレクションに追加しましょう。 これから追加するドキュメントは次のようなものです。
<?php
array( "i" => value );
?>
<?php
for($i=0; $i<100; $i++) {
$collection->insert( array( "i" => $i ) );
}
?>
先ほどと同じコレクションに、別のキーを持つ配列を追加していることに注目しましょう。 MongoDB が「スキーマフリー」であると言われるのは、こういう側面があるからです。
これで 101 件のドキュメントを追加したことになります (先ほどのループで 100 件、そして最初の 1 件)。 本当にそうなっているか、MongoCollection::count() メソッドで確認してみましょう。
<?php
echo $collection->count();
?>
コレクション内のすべてのドキュメントを取得するには MongoCollection::find() を使います。 find() メソッドは MongoCursor オブジェクトを返し、 これを使うとクエリにマッチしたドキュメントすべてに対する反復処理ができるようになります。 では、すべてのドキュメントを取得して表示させてみましょう。
<?php
$cursor = $collection->find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?>
The API documentation on MongoCollection::find() contains more information about finding data.
クエリを作って MongoCollection::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" の昇順でインデックスを作ります
?>