NAME

MongoDB::Async - Asynchronous Mongo Driver for Perl

ABOUT ASYNC DRIVER

This driver uses Coro and EV. It switches to another Coro thread while receiving response from server.

Changes:

MongoDB::Async::Pool - pool of persistent connects

Added ->data method to MongoDB::Async::Cursor. Same as ->all, but returns array ref

Please report bugs to nyaknyan@gmail.com

SYNOPSIS

    use MongoDB::Async;
	use Coro;
	use EV;
	use Coro::EV;
	
	my $connection = MongoDB::Async::Connection->new(host => 'localhost', port => 27017);
	my $database   = $connection->foo;
	my $collection = $database->bar;
	my $id         = $collection->insert({ some => 'data' });
	my $data       = $collection->find_one({ _id => $id });
	
	# or you can run threads 
	
	my $data;
	async{
		$data = MongoDB::Async::Connection->new->testdb->testcol->find({ _id => ["somebigdata", ....]})->data;
	};
	
	use Coro::AnyEvent; 
	async{
		while(! $data ){
			print "waiting for data...\n";
			Coro::AnyEvent::sleep(1);
		}
		print "done\n";
	};
	
	async{ # parallel query
		MongoDB::Async::Connection->new->testdb->testcol->save({ ... });
	};
	
	EV::loop;

INTRO TO MONGODB

This is the Perl driver for MongoDB, a document-oriented database. This section introduces some of the basic concepts of MongoDB. There's also a Tutorial pod that introduces using the driver. For more documentation on MongoDB in general, check out http://www.mongodb.org.

GETTING HELP

If you have any questions, comments, or complaints, you can get through to the developers most dependably via the MongoDB user list: mongodb-user@googlegroups.com. You might be able to get someone quicker through the MongoDB IRC channel, irc.freenode.net#mongodb.

AUTHORS

Florian Ragwitz <rafl@debian.org>
Kristina Chodorow <kristina@mongodb.org>

COPYRIGHT AND LICENSE

This software is Copyright (c) 2009 by 10Gen.

This is free software, licensed under:

The Apache License, Version 2.0, January 2004

DESCRIPTION

MongoDB is a database access module.

MongoDB (the database) store all strings as UTF-8. Non-UTF-8 strings will be forcibly converted to UTF-8. To convert something from another encoding to UTF-8, you can use Encode:

use Encode;

my $name = decode('cp932', "\x90\xbc\x96\xec\x81\x40\x91\xbe\x98\x59");
my $id = $coll->insert( { name => $name, } );

my $object = $coll->find_one( { name => $name } );

Thanks to taronishino for this example.

Notation and Conventions

The following conventions are used in this document:

$conn   Database connection
$db     Database
$coll   Collection
undef   NULL values are represented by undefined values in Perl
\@arr   Reference to an array passed to methods
\%attr  Reference to a hash of attribute values passed to methods

Note that Perl will automatically close and clean up database connections if all references to them are deleted.

Outline Usage

To use MongoDB, first you need to load the MongoDB module:

use MongoDB;
use strict;
use warnings;

(The use strict; and use warnings; isn't required, but it's strongly recommended.)

Then you need to connect to a Mongo database server. By default, Mongo listens for connections on port 27017. Unless otherwise noted, this documentation assumes you are running MongoDB locally on the default port.

Mongo can be started in authentication mode, which requires clients to log in before manipulating data. By default, Mongo does not start in this mode, so no username or password is required to make a fully functional connection. If you would like to learn more about authentication, see the authenticate method.

To connect to the database, create a new MongoDB Connection object:

$conn = MongoDB::Async::Connection->new("host" => "localhost:27017");

As this is the default, we can use the equivalent shorthand:

$conn = MongoDB::Async::Connection->new;

Connecting is relatively expensive, so try not to open superfluous connections.

There is no way to explicitly disconnect from the database. When $conn goes out of scope, the connection will automatically be closed and cleaned up.

INTERNALS

Class Hierarchy

The classes are arranged in a hierarchy: you cannot create a MongoDB::Async::Collection instance before you create MongoDB::Async::Database instance, for example. The full hierarchy is:

MongoDB::Async::Connection -> MongoDB::Async::Database -> MongoDB::Async::Collection

This is because MongoDB::Async::Database has a field that is a MongoDB::Async::Connection and MongoDB::Async::Collection has a MongoDB::Async::Database field.

When you call a MongoDB::Async::Collection function, it "trickles up" the chain of classes. For example, say we're inserting $doc into the collection bar in the database foo. The calls made look like:

$collection->insert($doc)

Calls MongoDB::Async::Database's implementation of insert, passing along the collection name ("foo").

$db->insert($name, $doc)

Calls MongoDB::Async::Connection's implementation of insert, passing along the fully qualified namespace ("foo.bar").

$connection->insert($ns, $doc)

MongoDB::Async::Connection does the actual work and sends a message to the database.

FUNCTIONS

These functions should generally not be used. They are very low level and have nice wrappers in MongoDB::Async::Collection.

write_insert($ns, \@objs)

my ($insert, $ids) = MongoDB::Async::write_insert("foo.bar", [{foo => 1}, {bar => -1}, {baz => 1}]);

Creates an insert string to be used by MongoDB::Async::Connection::send. The second argument is an array of hashes to insert. To imitate the behavior of MongoDB::Async::Collection::insert, pass a single hash, for example:

my ($insert, $ids) = MongoDB::Async::write_insert("foo.bar", [{foo => 1}]);

Passing multiple hashes imitates the behavior of MongoDB::Async::Collection::batch_insert.

This function returns the string and an array of the the _id fields that the inserted hashes will contain.

write_query($ns, $flags, $skip, $limit, $query, $fields?)

my ($query, $info) = MongoDB::Async::write_query('foo.$cmd', 0, 0, -1, {getlasterror => 1});

Creates a database query to be used by MongoDB::Async::Connection::send. $flags are query flags to use (see MongoDB::Async::Cursor::Flags for possible values). $skip is the number of results to skip, $limit is the number of results to return, $query is the query hash, and $fields is the optional fields to return.

This returns the query string and a hash of information about the query that is used by MongoDB::Async::Connection::recv to get the database response to the query.

write_update($ns, $criteria, $obj, $flags)

my ($update) = MongoDB::Async::write_update("foo.bar", {age => {'$lt' => 20}}, {'$set' => {young => true}}, 0);

Creates an update that can be used with MongoDB::Async::Connection::send. $flags can be 1 for upsert and/or 2 for updating multiple documents.

write_remove($ns, $criteria, $flags)

my ($remove) = MongoDB::Async::write_remove("foo.bar", {name => "joe"}, 0);

Creates a remove that can be used with MongoDB::Async::Connection::send. $flags can be 1 for removing just one matching document.

read_documents($buffer)

my @documents = MongoDB::Async::read_documents($buffer);

Decodes BSON documents from the given buffer

SEE ALSO

MongoDB main website http://www.mongodb.org/

Core documentation http://www.mongodb.org/display/DOCS/Manual

MongoDB::Async::Tutorial, MongoDB::Async::Examples