MongoDBをPerlで使うにあたり、一番最初に動作確認した時のスクリプトを整理しました。とりあえず最低限の動作確認はこれで十分かな。後は実際に使う時にドキュメントを調べればいいと思います。
####ネストされたHashにすら正規表現が使えるところが素敵
でも、ネストされた hash
内を正規表現を使って検索する例が意外とWeb上に例がなく、試行錯誤を繰り返してしまいました。Query 5
がそれです。出来てしまえば単純なことだったんですけどね。Query 4
にあるように、まずネストされた hash
の記述の仕方を確認するべきでした。急いてしまって、いきなりネストの情報にアクセスしようとして一時は「できないのか…」と諦めかけてしまいました。
下のスクリプトは最後に collection
と db
を削除しているので注意してください。
use strict;
use utf8;
use open ":utf8";
use open ":std";
use MongoDB;
use MongoDB::OID;
# http://search.cpan.org/~friedo/MongoDB/
# Make a client object.
my $client = MongoDB::MongoClient->new;
# my $client = MongoDB::MongoClient->new("host" => "localhost:27017",
# "username" => "foo",
# "password" => "bar");
# Make database object.
my $db = $client->get_database( 'test' );
# Make a collection(table) object.
my $atomics = $db->get_collection( 'atomic_symbol' );
# Insert a document(record) object.
$atomics->insert(
{"Z" => 1,
"symbol" => 'H',
"name" => {'ja' => '水素', 'en' => 'Hydrogen'},
"period" => 1
}
);
# Insert some documents using array.
my @data = ();
push @data, { 'Z'=>2, 'symbol'=>'He', 'period'=>1, 'name'=>{'en'=>'Helium', 'ja'=>'ヘリウム'} };
push @data, { 'Z'=>3, 'symbol'=>'Li', 'period'=>2, 'name'=>{'en'=>'Lithium', 'ja'=>'リチウム'} };
push @data, { 'Z'=>13, 'symbol'=>'Al', 'period'=>3, 'name'=>{'en'=>'Aluminum', 'ja'=>'アルミニウム'} };
push @data, { 'Z'=>30, 'symbol'=>'Zn', 'period'=>4, 'name'=>{'en'=>'Zinc', 'ja'=>'亜鉛'} };
push @data, { 'Z'=>36, 'symbol'=>'Kr', 'period'=>4, 'name'=>{'en'=>'Krypton', 'ja'=>'クリプトン'} };
push @data, { 'Z'=>96, 'symbol'=>'Cm', 'period'=>7, 'name'=>{'en'=>'Curium', 'ja'=>'キュリウム'} };
push @data, { 'Z'=>116, 'symbol'=>'Lv', 'period'=>7, 'name'=>{'en'=>'Livermorium', 'ja'=>'リバモリウム'} };
# Insert
my @ids = $atomics->batch_insert( \@data );
# Check id numbers.
foreach my $idn ( @ids ){
print "_id : $idn\n";
}
# Query 1
print "\nQuery 1\n";
my $some_atomics = $atomics->find( {'symbol' => 'He'} );
while ( my $atom = $some_atomics->next ){
print "Symbol : $atom->{'symbol'}\n";
}
# Query 2
print "\nQuery 2\n";
$some_atomics = $atomics->find( {'symbol'=>qr/.+N/i} );
while ( my $atom = $some_atomics->next ){
print "Symbol : $atom->{'symbol'}\n";
}
# Query 3
print "\nQuery 3\n";
$some_atomics = $atomics->find({ 'Z'=> {'$lte'=>30} });
while ( my $atom = $some_atomics->next ){
print "Z : $atom->{'Z'} / Symbol : $atom->{'symbol'}\n";
}
# Query 4
print "\nQuery 4: Hash in Hash\n";
my $all_atomics = $atomics->find( {'name.en'=>'Zinc'} );
while ( my $atom = $all_atomics->next ){
print "Symbol : $atom->{'symbol'} / Name : $atom->{'name'}->{'ja'}\n";
}
# Query 5: Hash in Hash with Regex
print "\nQuery 5: Hash in Hash with Regex\n";
$all_atomics = $atomics->find( { 'name.en'=> qr/.+iu.+/ } );
while ( my $atom = $all_atomics->next ){
print "Symbol : $atom->{'symbol'} / Name : $atom->{'name'}->{'ja'} / $atom->{'name'}->{'en'}\n";
}
# Update
# update (\%criteria, \%object, \%options?)
print "\nUpdate\n";
$atomics->update( { 'Z'=>{'$lte'=>30} },
{ '$inc'=>{'Z'=>1} },
{ 'upsert' => 1, 'multiple' => 1} );
# Check
$all_atomics = $atomics->find;
while ( my $atom = $all_atomics->next ){
print "Z : $atom->{'Z'} / Symbol : $atom->{'symbol'} / Name : $atom->{'name'}->{'ja'}\n";
}
# Delete Objects
$atomics->drop;
$db->drop;
##Result
$ perl mongoDB.pl
_id : 53f307c733519809206e5ed2
_id : 53f307c733519809206e5ed3
_id : 53f307c733519809206e5ed4
_id : 53f307c733519809206e5ed5
_id : 53f307c733519809206e5ed6
_id : 53f307c733519809206e5ed7
_id : 53f307c733519809206e5ed8
Query 1
Symbol : He
Query 2
Symbol : Zn
Query 3
Z : 1 / Symbol : H
Z : 2 / Symbol : He
Z : 3 / Symbol : Li
Z : 13 / Symbol : Al
Z : 30 / Symbol : Zn
Query 4: Hash in Hash
Symbol : Zn / Name : 亜鉛
Query 5: Hash in Hash with Regex
Symbol : He / Name : ヘリウム / Helium
Symbol : Li / Name : リチウム / Lithium
Symbol : Cm / Name : キュリウム / Curium
Symbol : Lv / Name : リバモリウム / Livermorium
Update
Z : 2 / Symbol : H / Name : 水素
Z : 3 / Symbol : He / Name : ヘリウム
Z : 4 / Symbol : Li / Name : リチウム
Z : 14 / Symbol : Al / Name : アルミニウム
Z : 31 / Symbol : Zn / Name : 亜鉛
Z : 36 / Symbol : Kr / Name : クリプトン
Z : 96 / Symbol : Cm / Name : キュリウム
Z : 116 / Symbol : Lv / Name : リバモリウム