Tutorial
Making a Connection
To connect to the database server, use one of the following:
<?php
$connection = new Mongo(); // connects to localhost:27017
$connection = new Mongo( "example.com" ); // connect to a remote host (default port)
$connection = new Mongo( "example.com:65432" ); // connect to a remote host at a given port
?>
Getting a Database
To select a database, use:
<?php
$db = $connection->dbname;
?>
<?php
$db = $connection->mybiglongdbname;
// do some stuff
$db = $connection->mybiglongdbnme;
// now connected to a different database!
?>
Getting A Collection
Getting a collection has the same syntax as getting a database:
<?php
$db = $connection->baz;
$collection = $db->foobar;
// or, more succinctly
$collection = $connection->baz->foobar;
?>
Inserting a Document
Associative arrays are the basic object that can be saved to a collection in the database. A somewhat random "document" might be:
<?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")
);
?>
To insert this document, use MongoCollection::insert():
<?php
$m = new Mongo();
$collection = $m->foo->bar;
$collection->insert( $doc );
?>
Finding Documents using MongoCollection::findOne()
To show that the document we inserted in the previous step is there, we can do a simple findOne() operation to get the first document in the collection. This method returns a single document (rather than the MongoCursor that MongoCollection::find() returns), and it's useful for things where 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. MongoDB reserves element names that start with _ and $ for internal use.
Adding Multiple Documents
In order to do more interesting things with queries, let's add multiple simple documents to the collection. These documents will just be
<?php
array( "i" => value );
?>
<?php
for($i=0; $i<100; $i++) {
$collection->insert( array( "i" => $i ) );
}
?>
Notice that we can insert arrays with different key sets into the same collection. This aspect is what we mean when we say that MongoDB is "schema-free".
Counting Documents in A Collection
Now that we've inserted 101 documents (the 100 we did in the loop, plus the first one), we can check to see if we have them all using the count() method.
<?php
echo $collection->count();
?>
MongoCollection::count() can take query and field arguments, as well. You can also do a count on a MongoCursor (see below), which will take into account any filters you have placed on your query.
Using a Cursor to Get All the Documents
In order to get all the documents in the collection, we will use MongoCollection::find(). The find() method returns a MongoCursor object which allows us to iterate over the set of documents that matched our query. So to query all of the documents and print them out:
<?php
$cursor = $collection->find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?>
Setting Criteria for a Query
We can create a query to pass to the find() method to get a subset of the documents in our collection. For example, if we wanted to find the document for which the value of the "i" field is 71, we would do the following:
<?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" }
Getting A Set of Documents With a Query
We can use the query to get a set of documents from our collection. For example, if we wanted to get all documents where "i" > 50, we could write:
<?php
$query = array( "i" => array( '$gt' => 50 ) ); //note the single quotes around '$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 ) );
?>
Creating An Index
MongoDB supports indexes, and they are very easy to add on a collection. To create an index, you just specify the field that should be indexed, and specify if you want the index to be ascending (1) or descending (-1). The following creates an ascending index on the "i" field :
<?php
$coll->ensureIndex( array( "i" => 1 ) ); // create index on "i"
$coll->ensureIndex( array( "i" => -1, "j" => 1 ) ); // index on "i" descending, "j" ascending
?>
A Quick Example
This example connects, inserts objects, queries for objects, iterates through query results, and disconnects from MongoDB.
<?php
// connect
$m = new Mongo();
// select a database
$db = $m->comedy;
$collection = $db->cartoons;
// add an element
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );
$collection->insert($obj);
// add another element, 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";
}
// disconnect
$m->close();
?>
This would output:
Calvin and Hobbes XKCD