MongoDBと少しのPerl

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

AMです。

今回もMongoDBについて書きたいと思います。
目的は、前回記事でも書いたように、NoSQLの勉強とNoSQLをもっと色々な人に知ってもらいたいためです。
※前回の記事はこちら→MongoDBを使ってみる

また、mongoDBのオフィシャルページでは、MongoDBと接続する言語ごとのドライバが提供されています。
MongoDB Drivers
今回はドライバを用いて、PerlでMongoDBを扱う例も載せています。

MongoDBと少しのPerl

【前回のおさらい】

まずは前回説明したMongoDBについておさらいしておきます。
起動コマンド

./bin/mongo

データベースの作成・指定

use sample

コレクション・ドキュメント・フィールドの作成(初回のみコレクションも作成)

db.sample_coll.insert({ "key1" : "value1", "key2" : "value2" })

ドキュメント・フィールドの作成

db.sample_coll.insert({ "keyA" : "valueA"})

ドキュメントの更新

db.sample_coll.update({"keyA":"valueA"},{"key3":"value3"})

ドキュメントの検索

db.sample_coll.find()

現在の状態を図で表すとこんな感じです。
現在の状態の図

以降はこの状態であることを前提としています。

一応ドキュメントの削除も書いておきます。

db.sample_coll.remove({"key3" : "value3"})

【様々なUpdate】

ここからは、updateについてもう少し書いてみたいと思います。

<Upsert>

Updateを行う際に、第3引数にtrueを設定すると、Upsertとなります。
まずは以下を実行してみてください。

db.sample_coll.update({“name”: “Tarou”}, { $set: {“age”: 20}})

これは「sample_collコレクションの{“name”: ”Tarou”}で引っかかるドキュメントのフィールド{“age”}に{20}をセットする」となりますが、当然{“name”: ”Tarou”}は存在しないため、何も更新されません。
では、以下を実行するとどうなるでしょうか?

db.sample_coll.update({“name”: “Tarou”}, { $set: {“age”: 20}}, true)

先ほどのように存在しなかった場合、新たにドキュメントを作成します。

 db.sample_coll.find()

結果


{ "_id" : ObjectId("英数字"), "key1" : "value1", "key2" : "value2" }
{ "_id" : ObjectId("英数字"), "key3" : "value3" }
{ "_id" : ObjectId("英数字"), "name" : "Tarou", "age" : 20 }

<更新修飾子>

先ほどのupdate例で「$set」という文字列を使用しました。
これを更新修飾子と呼び、updateに別の意味を作用させることができます。
他にも以下のような更新修飾子が存在します。
・$inc
 数値型のフィールドの値を指定した数だけ増やすことができます(マイナスを指定すれば減らすことができます)。

db.sample_coll.update({"name": "Tarou"}, { $inc: {"age": 2}})

db.sample_coll.find({name:”Tarou”})
結果


{ "_id" : ObjectId(“英数字"), "name" : "Tarou", "age" : 22 } #”age”の値が22になっている。

・$push
 配列型のフィールドに値を追加することができます。
 指定したフィールドが存在しなければ配列型でセットされ、指定したフィールドが配列型でなければエラーとなります。

db.sample_coll.update({"name": "Tarou"}, { $push: {"loves": "apple"}})
 db.sample_coll.update({"name": "Tarou"}, { $push: {"loves": "orange"}})

結果


{ "_id" : ObjectId("英数字"), "name" : "Tarou", "age" : 22, "loves" : [ "apple", "orange" ] }

<複数同時更新>

全ドキュメントに新たなフィールドを追加する場合は、1つずつupdateしなければいけないのでしょうか?
もちろんそんなことはなく、複数のドキュメントを一気に更新する方法もあります。

例えば、全ドキュメントに{“del_dlg”: “false”}をセットしたい場合は

db.sample_coll.update({}, { $set: {"del_flg": "false"}}, false, true)

このように第4引数にtrueを指定することで、実現が可能です。

【PerlでMongoDBを使う】

他にもインデックスやトランザクションなどについて書きたいと思うのですが、ここからは、冒頭でも明記していたように、Perlと接続したMongoDBを使用する例を書きたいと思います。
※Perlはインストールされているものとします。

<CPANを使ってドライバをインストール>

まずCPANをインストールし起動します。

yum install cpan
perl -MCPAN -e shell #rootで

起動したら、以下コマンドで、MongoDBドライバをインストールします。


cpan > o conf prerequisites_policy follow
cpan > o conf commit
cpan > force install MongoDB # forceで強制インストール。上記2つの設定でオールyesに

これでPerlでMongoDBが接続できるようになりました。

<PerlでMongoDBを動かしてみる>

以下のようなファイルを作成して正しくつなげているかをテストしてみましょう

Mongo_test.pl


#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use MongoDB;

my $client = MongoDB::Connection->new( host => 'localhost', port => 27017 );
my $database = $client->sample;
my $collection = $database->sample_coll;

if ($collection){
    print "\ncomplete!\n";
}

exit 0;

権限を与えて実行してみて、「complete!」の文字が出ればOKです。
※Can’t locate object method~~ HeUTF8~~といったエラーが出た場合は、ページ最下部の補足をご参照ください。

それでは、実際にデータを登録して、検索結果を表示してみましょう。
先ほどのファイルを編集します。


#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use MongoDB;
use Data::Dumper;

my $client = MongoDB::Connection->new( host => 'localhost', port => 27017 );
my $database = $client->sample;
my $collection = $database->sample_coll;

$collection->insert({ "key4" => "value4" });

my $find = $collection->find();

while ( my $data = $find->next ){
    print Dumper ($data);
}
exit 0;

実行してみるとDumperに則った形で、出力されていると思われます。

mongo側でも見てみましょう。

./bin/mongo
use sample
db.sample_coll.find()

今まで扱ってきたデータに加えて以下のドキュメントが存在すれば成功です。


{ "_id" : ObjectId("英数字"), "key4" : "value4" }

これでPerlでもMongoDBを扱うことができました。
Updateなどももちろんできるので、ぜひ挑戦してみてください。

今回はここまでです。

【補足】

本記事で紹介したMongo_test.plを実行したときに、「HeUTF8」の文字列を含んだエラーが出た場合は以下のような対処方法で修正できるかもしれません。

まずはMongoDBのドライバソースをダウンロード/解凍します。


cd /usr/local/src/
wget http://search.cpan.org/CPAN/authors/id/F/FR/FRIEDO/MongoDB-0.702.2.tar.gz
tar xvzf MongoDB-0.702.2.tar.gz
cd MongoDB-0.702.2

その中に存在するperl_mongo.hを編集します。
#include “ppport.h”と記述されている行の下に、以下を追記します。


#ifndef HeUTF8
#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
SvUTF8(HeKEY_sv(he)) : \
(U32)HeKUTF8(he))
#endif

保存して終了した後、makeファイルを実行し、インストールします。


perl Makefile.PL
make
make test
make install

参考にしてみてください。






広告システムについてのお問い合わせやご相談、パッケージ製品の詳細はこちらからどうぞ。
http://admage.jp/
アプリ計測SDK admage for Appのお問い合わせ・詳細はこちら。
http://apptizer.jp/

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

コメントを残す

*