The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
NAME
    MongoDBI - A proper ODM (Object-Document-Mapper) for MongoDB

VERSION
    version 0.02

SYNOPSIS
    ... in CDDB.pm

        package CDDB;

        use MongoDBI;

        app {

            # shared mongodb connection
            database => {
                name => 'mongodbi_cddb',
                host => 'mongodb://localhost:27017'
            },

            # load child doc classes
            classes => {
                self => 1, # loads CDDB::*
                load => ['Other::Namespace']
            }

        };

        1;

    ... in CDDB/Album.pm

        package CDDB::Album;

        use MongoDBI::Document;

        # collection name
        store 'albums';

        # required fields
        key 'title',    is_str,  is_req;
        key 'released', is_date, is_req;

        # optional fields
        key 'rating', is_int, default => 1;

        # embedded documents
        embed 'tracks', class => 'CDDB::Track', type => 'multiple';

        # related artist document
        has_one 'band', class => 'CDDB::Artist';

        # stored query
        filter 'top_rated' => sub {

            my ($filter, $self, @args) = @_;

            $filter->where('rating$gte' => 5 )

        };

        1;

    ... and finally in your script.pl

        use DateTime;

        my $cddb = CDDB->new;

        my $cds  = $cddb->class('album'); # grabs CDDB::Album

        my $cd = $cds->new(
            title    => 'Just doin my job boss',
            released => DateTime->now
        );

        $cd->insert;

        # search using stored query (aka filter) and loop
        $cds->search('top_rated')->foreach_document(sub{
            print shift->{title}, "\n"
        });

DESCRIPTION
    NOTE: This librrary is scheduled for a complete rewrite in the comming
    months.

    Why a document database, why MongoDB? "MongoDB has the best features of
    document, key/value and relational databases, and is designed to be
    web-scale".

    Why not an RDBMS? "Use the right tool for the job, there are no silver
    bullets, one-size does not fit all, variety is good, TIMTOWTDI, etc,
    etc.", additionally, if an RDBMS fits your use-case better as-a-whole,
    then thats the tool you should use, and likewise, if an RDBMS only
    partially solves your problem, then you should use it partially. The
    point is, implement what makes sense.

    MongoDBI is an Object-Document-Mapper (ODM) for MongoDB. It allows you
    to create Moose-based classes to interact with MongoDB databases. Born
    out of the frustration of waiting for someone else to create a proper
    MongoDB modeling framework, I decided to bite-the-bullet and try my hand
    at it.

    At-a-glance, most will enjoy MongoDBI for its ability to easily model
    classes while leveraging the power of MongoDB's schemaless and
    expeditious document-based design, dynamic queries, and atomic modifier
    operations.

    Also noteworthy is MongoDBI's ease-of-use, chainable search facilities
    (filters), automated indexing, moose-integration (inheritance support,
    etc), lean document updates via dirty field tracking, and ability for
    each class to be configured to use a different database and connection,
    etc.

    This class, MongoDBI, sub-classes MongoDBI::Application, please review
    that module for more usage information.

AUTHORS
    *   Al Newkirk <awncorp@cpan.org>

    *   Robert Grimes <buu@erxz.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2012 by awncorp.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.