Tutorial
Making a Connection
To connect to the database server, use one of the following:
]]>
Now $connection can be used to get a database.
Getting a Database
To select a database, use:
dbname;
?>
]]>
The database does not need to be created in advance, you can create new
databases by selecting them. Be careful of typos! You can inadvertently
create a new database, which can cause confusing errors:
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:
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:
"MongoDB",
"type" => "database",
"count" => 1,
"info" => (object)array( "x" => 203,
"y" => 102),
"versions" => array("0.9.7", "0.9.8", "0.9.9")
);
?>
]]>
Note that you can have nested arrays and objects. Objects and documents are
almost synonymous in MongoDB: you could call $doc a document or an object,
but the "info" field is always an object, never a document. This convention
is used for all of the documentation.
To insert this document, use MongoCollection::insert:
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.
findOne();
var_dump( $obj );
?>
]]>
and you should see
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
value );
?>
]]>
and we can do this fairly efficiently in a loop
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.
count();
?>
]]>
and it should print 101.
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:
find();
foreach ($cursor as $id => $value) {
echo "$id: ";
var_dump( $value );
}
?>
]]>
and that should print all 101 documents in the collection. $id is the _id
field of a document, and $value is the document itself.
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:
71 );
$cursor = $collection->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
]]>
and it should just print just one document
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:
array( '$gt' => 50 ) ); //note the single quotes around '$gt'
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
]]>
which should print the documents where i > 50. We could also get a range, say
20 < i <= 30:
array( "\$gt" => 20, "\$lte" => 30 ) );
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_dump( $cursor->getNext() );
}
?>
]]>
As it is easy to forget to escape the "$", you can also choose your own
special character to use instead of '$'. Choose a character that will not
occur in your key names, e.g. ":", and add the following line to php.ini:
Then the example above would look like:
array( ":gt" => 20, ":lte" => 30 ) );
?>
]]>
You can also change it in your code using ini_set("mongo.cmd", ":"). Of
course, you can also just use single quotes around the $.
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 :
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.
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: