—#
# Copyright 2009-2013 MongoDB, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package
MongoDB::Database;
# ABSTRACT: A MongoDB Database
use
version;
our
$VERSION
=
'v1.3.2'
;
# TRIAL
use
MongoDB::Error;
use
MongoDB::GridFS;
use
MongoDB::_Query;
BSONCodec
NonNegNum
ReadPreference
ReadConcern
WriteConcern
)
;
InstanceOf
Str
)
;
use
boolean;
use
Moo;
use
Try::Tiny;
has
_client
=> (
is
=>
'ro'
,
isa
=> InstanceOf[
'MongoDB::MongoClient'
],
required
=> 1,
);
#pod =attr name
#pod
#pod The name of the database.
#pod
#pod =cut
has
name
=> (
is
=>
'ro'
,
isa
=> Str,
required
=> 1,
);
#pod =attr read_preference
#pod
#pod A L<MongoDB::ReadPreference> object. It may be initialized with a string
#pod corresponding to one of the valid read preference modes or a hash reference
#pod that will be coerced into a new MongoDB::ReadPreference object.
#pod By default it will be inherited from a L<MongoDB::MongoClient> object.
#pod
#pod =cut
has
read_preference
=> (
is
=>
'ro'
,
isa
=> ReadPreference,
required
=> 1,
coerce
=> ReadPreference->coercion,
);
#pod =attr write_concern
#pod
#pod A L<MongoDB::WriteConcern> object. It may be initialized with a hash
#pod reference that will be coerced into a new MongoDB::WriteConcern object.
#pod By default it will be inherited from a L<MongoDB::MongoClient> object.
#pod
#pod =cut
has
write_concern
=> (
is
=>
'ro'
,
isa
=> WriteConcern,
required
=> 1,
coerce
=> WriteConcern->coercion,
);
#pod =attr read_concern
#pod
#pod A L<MongoDB::ReadConcern> object. May be initialized with a hash
#pod reference or a string that will be coerced into the level of read
#pod concern.
#pod
#pod By default it will be inherited from a L<MongoDB::MongoClient> object.
#pod
#pod =cut
has
read_concern
=> (
is
=>
'ro'
,
isa
=> ReadConcern,
required
=> 1,
coerce
=> ReadConcern->coercion,
);
#pod =attr max_time_ms
#pod
#pod Specifies the maximum amount of time in milliseconds that the server should use
#pod for working on a query.
#pod
#pod B<Note>: this will only be used for server versions 2.6 or greater, as that
#pod was when the C<$maxTimeMS> meta-operator was introduced.
#pod
#pod =cut
has
max_time_ms
=> (
is
=>
'ro'
,
isa
=> NonNegNum,
required
=> 1,
);
#pod =attr bson_codec
#pod
#pod An object that provides the C<encode_one> and C<decode_one> methods, such as
#pod from L<MongoDB::BSON>. It may be initialized with a hash reference that will
#pod be coerced into a new MongoDB::BSON object. By default it will be inherited
#pod from a L<MongoDB::MongoClient> object.
#pod
#pod =cut
has
bson_codec
=> (
is
=>
'ro'
,
isa
=> BSONCodec,
coerce
=> BSONCodec->coercion,
required
=> 1,
);
#--------------------------------------------------------------------------#
# methods
#--------------------------------------------------------------------------#
#pod =method list_collections
#pod
#pod $result = $coll->list_collections( $filter );
#pod $result = $coll->list_collections( $filter, $options );
#pod
#pod Returns a L<MongoDB::QueryResult> object to iterate over collection description
#pod documents. These will contain C<name> and C<options> keys like so:
#pod
#pod use boolean;
#pod
#pod {
#pod name => "my_capped_collection",
#pod options => {
#pod capped => true,
#pod size => 10485760,
#pod }
#pod },
#pod
#pod An optional filter document may be provided, which cause only collection
#pod description documents matching a filter expression to be returned. See the
#pod L<listCollections command
#pod documentation|http://docs.mongodb.org/manual/reference/command/listCollections/>
#pod for more details on filtering for specific collections.
#pod
#pod A hash reference of options may be provided. Valid keys include:
#pod
#pod =for :list
#pod * C<batchSize> – the number of documents to return per batch.
#pod * C<maxTimeMS> – the maximum amount of time in milliseconds to allow the
#pod command to run. (Note, this will be ignored for servers before version 2.6.)
#pod
#pod =cut
my
$list_collections_args
;
sub
list_collections {
my
(
$self
,
$filter
,
$options
) =
@_
;
$filter
||= {};
$options
||= {};
# possibly fallback to default maxTimeMS
if
( !
exists
$options
->{maxTimeMS} &&
$self
->max_time_ms ) {
$options
->{maxTimeMS} =
$self
->max_time_ms;
}
my
$op
= MongoDB::Op::_ListCollections->_new(
db_name
=>
$self
->name,
client
=>
$self
->_client,
bson_codec
=>
$self
->bson_codec,
filter
=>
$filter
,
options
=>
$options
,
);
return
$self
->_client->send_read_op(
$op
);
}
#pod =method collection_names
#pod
#pod my @collections = $database->collection_names;
#pod
#pod Returns the list of collections in this database.
#pod
#pod B<Warning:> if the number of collections is very large, this will return
#pod a very large result. Use L</list_collections> to iterate over collections
#pod instead.
#pod
#pod =cut
sub
collection_names {
my
(
$self
) =
@_
;
my
$op
= MongoDB::Op::_ListCollections->_new(
db_name
=>
$self
->name,
client
=>
$self
->_client,
bson_codec
=>
$self
->bson_codec,
filter
=> {},
options
=> {},
);
my
$res
=
$self
->_client->send_read_op(
$op
);
return
map
{
$_
->{name} }
$res
->all;
}
#pod =method get_collection, coll
#pod
#pod my $collection = $database->get_collection('foo');
#pod my $collection = $database->get_collection('foo', $options);
#pod my $collection = $database->coll('foo', $options);
#pod
#pod Returns a L<MongoDB::Collection> for the given collection name within this
#pod database.
#pod
#pod It takes an optional hash reference of options that are passed to the
#pod L<MongoDB::Collection> constructor.
#pod
#pod The C<coll> method is an alias for C<get_collection>.
#pod
#pod =cut
sub
get_collection {
my
(
$self
,
$collection_name
,
$options
) =
@_
;
return
MongoDB::Collection->new(
read_preference
=>
$self
->read_preference,
write_concern
=>
$self
->write_concern,
read_concern
=>
$self
->read_concern,
bson_codec
=>
$self
->bson_codec,
max_time_ms
=>
$self
->max_time_ms,
(
$options
?
%$options
: () ),
# not allowed to be overridden by options
database
=>
$self
,
name
=>
$collection_name
,
);
}
{
no
warnings
'once'
;
*coll
= \
&get_collection
}
#pod =method get_gridfsbucket, gfs
#pod
#pod my $grid = $database->get_gridfsbucket;
#pod my $grid = $database->get_gridfsbucket($options);
#pod my $grid = $database->gfs($options);
#pod
#pod This method returns a L<MongoDB::GridFSBucket> object for storing and
#pod retrieving files from the database.
#pod
#pod It takes an optional hash reference of options that are passed to the
#pod L<MongoDB::GridFSBucket> constructor.
#pod
#pod See L<MongoDB::GridFSBucket> for more information.
#pod
#pod The C<gfs> method is an alias for C<get_gridfsbucket>.
#pod
#pod =cut
sub
get_gridfsbucket {
my
(
$self
,
$options
) =
@_
;
return
MongoDB::GridFSBucket->new(
read_preference
=>
$self
->read_preference,
write_concern
=>
$self
->write_concern,
read_concern
=>
$self
->read_concern,
bson_codec
=>
$self
->bson_codec,
max_time_ms
=>
$self
->max_time_ms,
(
$options
?
%$options
: () ),
# not allowed to be overridden by options
database
=>
$self
,
)
}
{
no
warnings
'once'
;
*gfs
= \
&get_gridfsbucket
}
#pod =method get_gridfs (DEPRECATED)
#pod
#pod my $grid = $database->get_gridfs;
#pod my $grid = $database->get_gridfs("fs");
#pod my $grid = $database->get_gridfs("fs", $options);
#pod
#pod The L<MongoDB::GridFS> class has been deprecated in favor of the new MongoDB
#pod driver-wide standard GridFS API, available via L<MongoDB::GridFSBucket> and
#pod the C<get_gridfsbucket>/C<gfs> methods.
#pod
#pod This method returns a L<MongoDB::GridFS> for storing and retrieving files
#pod from the database. Default prefix is "fs", making C<$grid-E<gt>files>
#pod "fs.files" and C<$grid-E<gt>chunks> "fs.chunks".
#pod
#pod It takes an optional hash reference of options that are passed to the
#pod L<MongoDB::GridFS> constructor.
#pod
#pod See L<MongoDB::GridFS> for more information.
#pod
#pod =cut
sub
get_gridfs {
my
(
$self
,
$prefix
,
$options
) =
@_
;
$prefix
=
"fs"
unless
$prefix
;
return
MongoDB::GridFS->new(
read_preference
=>
$self
->read_preference,
write_concern
=>
$self
->write_concern,
max_time_ms
=>
$self
->max_time_ms,
bson_codec
=>
$self
->bson_codec,
(
$options
?
%$options
: () ),
# not allowed to be overridden by options
_database
=>
$self
,
prefix
=>
$prefix
);
}
#pod =method drop
#pod
#pod $database->drop;
#pod
#pod Deletes the database.
#pod
#pod =cut
sub
drop {
my
(
$self
) =
@_
;
return
$self
->run_command({
'dropDatabase'
=> 1 });
}
#pod =method run_command
#pod
#pod my $output = $database->run_command([ some_command => 1 ]);
#pod
#pod my $output = $database->run_command(
#pod [ some_command => 1 ],
#pod { mode => 'secondaryPreferred' }
#pod );
#pod
#pod This method runs a database command. The first argument must be a document
#pod with the command and its arguments. It should be given as an array reference
#pod of key-value pairs or a L<Tie::IxHash> object with the command name as the
#pod first key. The use of a hash reference will only reliably work for commands
#pod without additional parameters.
#pod
#pod By default, commands are run with a read preference of 'primary'. An optional
#pod second argument may specify an alternative read preference. If given, it must
#pod be a L<MongoDB::ReadPreference> object or a hash reference that can be used to
#pod construct one.
#pod
#pod It returns the output of the command (a hash reference) on success or throws a
#pod L<MongoDB::DatabaseError|MongoDB::Error/MongoDB::DatabaseError> exception if
#pod the command fails.
#pod
#pod For a list of possible database commands, run:
#pod
#pod my $commands = $db->run_command([listCommands => 1]);
#pod
#pod There are a few examples of database commands in the
#pod L<MongoDB::Examples/"DATABASE COMMANDS"> section. See also core documentation
#pod on database commands: L<http://dochub.mongodb.org/core/commands>.
#pod
#pod =cut
sub
run_command {
my
(
$self
,
$command
,
$read_pref
) =
@_
;
$read_pref
= MongoDB::ReadPreference->new(
ref
(
$read_pref
) ?
$read_pref
: (
mode
=>
$read_pref
) )
if
$read_pref
&&
ref
(
$read_pref
) ne
'MongoDB::ReadPreference'
;
my
$op
= MongoDB::Op::_Command->_new(
db_name
=>
$self
->name,
query
=>
$command
,
query_flags
=> {},
bson_codec
=>
$self
->bson_codec,
read_preference
=>
$read_pref
,
);
my
$obj
=
$self
->_client->send_read_op(
$op
);
return
$obj
->output;
}
#--------------------------------------------------------------------------#
# deprecated methods
#--------------------------------------------------------------------------#
sub
eval
{
my
(
$self
,
$code
,
$args
,
$nolock
) =
@_
;
$nolock
= boolean::false
unless
defined
$nolock
;
my
$cmd
=
tie
(
my
%hash
,
'Tie::IxHash'
);
%hash
= (
'$eval'
=>
$code
,
'args'
=>
$args
,
'nolock'
=>
$nolock
);
my
$output
=
$self
->run_command(
$cmd
);
if
(
ref
$output
eq
'HASH'
&&
exists
$output
->{
'retval'
}) {
return
$output
->{
'retval'
};
}
else
{
return
$output
;
}
}
sub
last_error {
my
(
$self
,
$opt
) =
@_
;
return
$self
->run_command( [
getlasterror
=> 1, (
$opt
?
%$opt
: () ) ] );
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
MongoDB::Database - A MongoDB Database
=head1 VERSION
version v1.3.2
=head1 SYNOPSIS
# get a Database object via MongoDB::MongoClient
my $db = $client->get_database("foo");
# get a Collection via the Database object
my $coll = $db->get_collection("people");
# run a command on a database
my $res = $db->run_command([ismaster => 1]);
=head1 DESCRIPTION
This class models a MongoDB database. Use it to construct
L<MongoDB::Collection> objects. It also provides the L</run_command> method and
some convenience methods that use it.
Generally, you never construct one of these directly with C<new>. Instead, you
call C<get_database> on a L<MongoDB::MongoClient> object.
=head1 USAGE
=head2 Error handling
Unless otherwise explictly documented, all methods throw exceptions if
an error occurs. The error types are documented in L<MongoDB::Error>.
To catch and handle errors, the L<Try::Tiny> and L<Safe::Isa> modules
are recommended:
use Try::Tiny;
use Safe::Isa; # provides $_isa
try {
$db->run_command( @command )
}
catch {
if ( $_->$_isa("MongoDB::DuplicateKeyError" ) {
...
}
else {
...
}
};
To retry failures automatically, consider using L<Try::Tiny::Retry>.
=head1 ATTRIBUTES
=head2 name
The name of the database.
=head2 read_preference
A L<MongoDB::ReadPreference> object. It may be initialized with a string
corresponding to one of the valid read preference modes or a hash reference
that will be coerced into a new MongoDB::ReadPreference object.
By default it will be inherited from a L<MongoDB::MongoClient> object.
=head2 write_concern
A L<MongoDB::WriteConcern> object. It may be initialized with a hash
reference that will be coerced into a new MongoDB::WriteConcern object.
By default it will be inherited from a L<MongoDB::MongoClient> object.
=head2 read_concern
A L<MongoDB::ReadConcern> object. May be initialized with a hash
reference or a string that will be coerced into the level of read
concern.
By default it will be inherited from a L<MongoDB::MongoClient> object.
=head2 max_time_ms
Specifies the maximum amount of time in milliseconds that the server should use
for working on a query.
B<Note>: this will only be used for server versions 2.6 or greater, as that
was when the C<$maxTimeMS> meta-operator was introduced.
=head2 bson_codec
An object that provides the C<encode_one> and C<decode_one> methods, such as
from L<MongoDB::BSON>. It may be initialized with a hash reference that will
be coerced into a new MongoDB::BSON object. By default it will be inherited
from a L<MongoDB::MongoClient> object.
=head1 METHODS
=head2 list_collections
$result = $coll->list_collections( $filter );
$result = $coll->list_collections( $filter, $options );
Returns a L<MongoDB::QueryResult> object to iterate over collection description
documents. These will contain C<name> and C<options> keys like so:
use boolean;
{
name => "my_capped_collection",
options => {
capped => true,
size => 10485760,
}
},
An optional filter document may be provided, which cause only collection
description documents matching a filter expression to be returned. See the
L<listCollections command
for more details on filtering for specific collections.
A hash reference of options may be provided. Valid keys include:
=over 4
=item *
C<batchSize> – the number of documents to return per batch.
=item *
C<maxTimeMS> – the maximum amount of time in milliseconds to allow the command to run. (Note, this will be ignored for servers before version 2.6.)
=back
=head2 collection_names
my @collections = $database->collection_names;
Returns the list of collections in this database.
B<Warning:> if the number of collections is very large, this will return
a very large result. Use L</list_collections> to iterate over collections
instead.
=head2 get_collection, coll
my $collection = $database->get_collection('foo');
my $collection = $database->get_collection('foo', $options);
my $collection = $database->coll('foo', $options);
Returns a L<MongoDB::Collection> for the given collection name within this
database.
It takes an optional hash reference of options that are passed to the
L<MongoDB::Collection> constructor.
The C<coll> method is an alias for C<get_collection>.
=head2 get_gridfsbucket, gfs
my $grid = $database->get_gridfsbucket;
my $grid = $database->get_gridfsbucket($options);
my $grid = $database->gfs($options);
This method returns a L<MongoDB::GridFSBucket> object for storing and
retrieving files from the database.
It takes an optional hash reference of options that are passed to the
L<MongoDB::GridFSBucket> constructor.
See L<MongoDB::GridFSBucket> for more information.
The C<gfs> method is an alias for C<get_gridfsbucket>.
=head2 get_gridfs (DEPRECATED)
my $grid = $database->get_gridfs;
my $grid = $database->get_gridfs("fs");
my $grid = $database->get_gridfs("fs", $options);
The L<MongoDB::GridFS> class has been deprecated in favor of the new MongoDB
driver-wide standard GridFS API, available via L<MongoDB::GridFSBucket> and
the C<get_gridfsbucket>/C<gfs> methods.
This method returns a L<MongoDB::GridFS> for storing and retrieving files
from the database. Default prefix is "fs", making C<$grid-E<gt>files>
"fs.files" and C<$grid-E<gt>chunks> "fs.chunks".
It takes an optional hash reference of options that are passed to the
L<MongoDB::GridFS> constructor.
See L<MongoDB::GridFS> for more information.
=head2 drop
$database->drop;
Deletes the database.
=head2 run_command
my $output = $database->run_command([ some_command => 1 ]);
my $output = $database->run_command(
[ some_command => 1 ],
{ mode => 'secondaryPreferred' }
);
This method runs a database command. The first argument must be a document
with the command and its arguments. It should be given as an array reference
of key-value pairs or a L<Tie::IxHash> object with the command name as the
first key. The use of a hash reference will only reliably work for commands
without additional parameters.
By default, commands are run with a read preference of 'primary'. An optional
second argument may specify an alternative read preference. If given, it must
be a L<MongoDB::ReadPreference> object or a hash reference that can be used to
construct one.
It returns the output of the command (a hash reference) on success or throws a
L<MongoDB::DatabaseError|MongoDB::Error/MongoDB::DatabaseError> exception if
the command fails.
For a list of possible database commands, run:
my $commands = $db->run_command([listCommands => 1]);
There are a few examples of database commands in the
L<MongoDB::Examples/"DATABASE COMMANDS"> section. See also core documentation
on database commands: L<http://dochub.mongodb.org/core/commands>.
=for Pod::Coverage last_error
=head1 DEPRECATIONS
The methods still exist, but are no longer documented. In a future version
they will warn when used, then will eventually be removed.
=over 4
=item *
last_error
=back
=head1 AUTHORS
=over 4
=item *
David Golden <david@mongodb.com>
=item *
Mike Friedman <friedo@friedo.com>
=item *
Kristina Chodorow <k.chodorow@gmail.com>
=item *
Florian Ragwitz <rafl@debian.org>
=back
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2016 by MongoDB, Inc..
This is free software, licensed under:
The Apache License, Version 2.0, January 2004
=cut