The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MongoDB::Collection;
our $VERSION = '0.01';

# ABSTRACT: A Mongo Collection

use Any::Moose;

has _database => (
    is       => 'ro',
    isa      => 'MongoDB::Database',
    required => 1,
    handles  => [qw/query find_one insert update remove ensure_index/],
);


has name => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);


has full_name => (
    is      => 'ro',
    isa     => 'Str',
    lazy    => 1,
    builder => '_build_full_name',
);

sub _build_full_name {
    my ($self) = @_;
    my $name    = $self->name;
    my $db_name = $self->_database->name;
    return "${db_name}.${name}";
}


around qw/query find_one insert update remove ensure_index/ => sub {
    my ($next, $self, @args) = @_;
    return $self->$next($self->_query_ns, @args);
};

sub _query_ns {
    my ($self) = @_;
    return $self->name;
}


sub count {
    my ($self, $query) = @_;
    $query ||= {};

    my $obj;
    eval {
        $obj = $self->_database->run_command({
            count => $self->name,
            query => $query,
        });
    };

    if (my $error = $@) {
        if ($error =~ m/^ns missing/) {
            return 0;
        }
        die $error;
    }

    return $obj->{n};
}


sub validate {
    my ($self, $scan_data) = @_;
    $scan_data = 0 unless defined $scan_data;
    my $obj = $self->_database->run_command({ validate => $self->name });
}


sub drop_indexes {
    my ($self) = @_;
    return $self->drop_index('*');
}


sub drop_index {
    my ($self, $index_name) = @_;
    return $self->_database->run_command([
        deleteIndexes => $self->name,
        index         => $index_name,
    ]);
}


sub get_indexes {
    my ($self) = @_;
    return $self->_database->get_collection('system.indexes')->query({
        ns => $self->full_name,
    })->all;
}


sub drop {
    my ($self) = @_;
    $self->drop_indexes;
    $self->_database->run_command({ drop => $self->name });
    return;
}

no Any::Moose;
__PACKAGE__->meta->make_immutable;

1;

__END__
=head1 NAME

MongoDB::Collection - A Mongo Collection

=head1 VERSION

version 0.01

=head1 ATTRIBUTES

=head2 name

The name of the collection.



=head2 full_name

The full_name of the collection, including the namespace of the database it's
in.



=head1 METHODS

=head2 query ($query)

    my $cursor = $collection->query({ i => { '$gt' => 42 } });

Executes the given C<$query> and returns a C<MongoDB::Cursor> with the results.

=head2 find_one ($query)

    my $object = $collection->find_one({ name => 'Resi' });

Executes the given C<$query> and returns the first object matching it.

=head2 insert ($object)

    my $id = $collection->insert({ name => 'mongo', type => 'database' });

Inserts the given C<$object> into the database and returns its C<MongoDB::OID>.

=head2 update ($update, $upsert?)

    $collection->update($object);

Updates an existing C<$object> in the database.

=head2 remove ($query)

    $collection->remove({ answer => { '$ne' => 42 } });

Removes all objects matching the given C<$query> from the database.

=head2 ensure_index (\@keys, $direction?)

    $collection->ensure_index([qw/foo bar/]);

Makes sure the given C<@keys> of this collection are indexed. The optional
index direction defaults to C<ascending>.



=head2 count ($query)

    my $n_objects = $collection->count({ name => 'Bob' });

Counts the number of objects in this collection that match the given C<$query>.



=head2 validate

    $collection->validate;

Asks the server to validate this collection.



=head2 drop_indexes

    $collection->drop_indexes;

Removes all indexes from this collection.



=head2 drop_index ($index_name)

    $collection->drop_index('foo');

Removes an index called C<$index_name> from this collection.



=head2 get_indexes

    my @indexes = $collection->get_indexes;

Returns a list of all indexes of this collection.



=head2 drop

    $collection->drop;

Deletes a collection as well as all of its indexes.

=head1 AUTHOR

  Florian Ragwitz <rafl@debian.org>

=head1 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