ishiducaの日記 このページをアンテナに追加 RSSフィード

2010-09-22

[]手軽にMongoDBの任意のcollectionにアクセスするモジュール試行(錯誤) 21:40 手軽にMongoDBの任意のcollectionにアクセスするモジュール試行(錯誤) - ishiducaの日記 を含むブックマーク はてなブックマーク - 手軽にMongoDBの任意のcollectionにアクセスするモジュール試行(錯誤) - ishiducaの日記 手軽にMongoDBの任意のcollectionにアクセスするモジュール試行(錯誤) - ishiducaの日記 のブックマークコメント

手軽にMongoDBの任意のcollectionにアクセスするモジュールを試行錯誤している。

下の例だと MyMongoDBLite->new したPerlオブジェクトに

  • MongoDB::Connectionオブジェクト
  • MongoDB::Databaseオブジェクト
  • MongoDB::Collectionオブジェクト

を各々「ひとつ」格納していて、newしたPerlオブジェクトの「database」「collection」メソッドでget/setするようにしてみた

MyMongoDBLite.pm

package MyMongoDBLite;
use strict;
use warnings;
use MongoDB;

sub new {
    my $class = shift;
    my %args  = @_;

    $args{server} or $args{server} = 'localhost';
    $args{port}   or $args{port}   = '27017';

    my $mongodb = bless {}, $class;
    $mongodb->{connection} = MongoDB::Connection->new(
        server => $args{server}, port => $args{port} );

    if ($args{database}) {
        $mongodb->{database} =
            $mongodb->{connection}->get_database( $args{database} );

        if ($args{collection}) { 
            $mongodb->{collection} = 
                $mongodb->{database}->get_collection( $args{collection} );
        }
    }

    $mongodb;
}

sub database {
    my $self = shift;
    $self->connection or die qq(not found "connection".);
    if ($_[0]) {
        $self->{database} =
            $self->{connection}->get_database( $_[0] );
    }
    $self->{database};
}

sub collection {
    my $self = shift;
    $self->{database} or die qq(not found "database".);
    if ($_[0]) {
        $self->{collection} =
            $self->{database}->get_collection( $_[0] );
    }
    $self->{collection};
}

1;

例えば データベース "mydb" の "pixiv" コレクションにアクセスしてみる

get_pixiv_favorite_url.pl

use strict;
use warnings;
use MyMongoDBLite;

my $mongodb = MyMongoDBLite->new(
    server     => 'localhost',
    port       => '27017',
    database   => 'mydb',
    collection => 'pixiv'
);

my $query  = { link => qr/http/ };
my $cursor = $mongodb->collection->query( $query );
while (my $object = $cursor->next) {
    print "$object->{comment}\n";
}

exit 0;

ワンライナーでアクセスする

$ perl -MMyMongoDBLite -e 'print MyMongoDBLite->new(database => "mydb", collection => "pixiv")->collection->find_one({ link => qr/http/ })->{comment}'

とか

$ perl -MMyMongoDBLite -le '$c=MyMongoDBLite->new(database => "mydb")->collection("pixiv")->query({ link => qr/http/ });print $_->{comment} while $_ = $c->next;'

しかし、書き方に違和感が。本来なら

my $connection = MyMongoDBLite->new;
my $collection = $connection->database('mydb')->collection('pixiv');

となった方が自然だよね

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100922