<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>infoalive labs &#187; MongoDB</title>
	<atom:link href="http://labs.infoalive.com/category/mongodb/feed" rel="self" type="application/rss+xml" />
	<link>http://labs.infoalive.com</link>
	<description>プロダクトの紹介とTipsのまとめサイト</description>
	<lastBuildDate>Fri, 04 Nov 2011 10:15:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>MongoDB勉強会</title>
		<link>http://labs.infoalive.com/presentation/276</link>
		<comments>http://labs.infoalive.com/presentation/276#comments</comments>
		<pubDate>Mon, 13 Dec 2010 07:50:42 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[プレゼン]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=276</guid>
		<description><![CDATA[○MongoDBとMySQLの同時接続時のパフォーマンスを評価しました。 MongoDB速度評価(PDF形式) ○社内向けにMongoDB勉強会をしました。 Mongo db勉強会 View more presentat [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Fpresentation%2F276"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Fpresentation%2F276&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>○MongoDBとMySQLの同時接続時のパフォーマンスを評価しました。<br />
<a href="http://labs.infoalive.com/wp-content/uploads/2010/12/MongoDB速度評価.pdf">MongoDB速度評価</a>(PDF形式)</p>
<p>○社内向けにMongoDB勉強会をしました。</p>
<div id="__ss_6138606" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="Mongo db勉強会" href="http://www.slideshare.net/otmb/mongo-db-6138606">Mongo db勉強会</a></strong><object id="__sse6138606" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101213014739-phpapp01&amp;stripped_title=mongo-db-6138606&amp;userName=otmb" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-101213014739-phpapp01&amp;stripped_title=mongo-db-6138606&amp;userName=otmb" name="__sse6138606" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/otmb">otmb</a>.</div>
</div>
<p>社内向けにMongoDB勉強会をしました。<br />
社内フレームワークDeco上での実装について。</p>
<g:plusone href="http://labs.infoalive.com/presentation/276"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/presentation/276/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mongodb のバックアップスクリプト</title>
		<link>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/260</link>
		<comments>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/260#comments</comments>
		<pubDate>Mon, 29 Nov 2010 08:44:14 +0000</pubDate>
		<dc:creator>岩本＠サーバー事業部</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[サーバー]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/uncategorized/260</guid>
		<description><![CDATA[先日から社内がMongoDB一色です。どうもこんにちは、岩本＠サーバー事業部です。 とゆうわけで、MongoDBのバックアップスクリプト書きました。 弊社はサーバー監視にNagiosを使っているので、通知部分にはNagi [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2F%25e3%2582%25b5%25e3%2583%25bc%25e3%2583%2590%25e3%2583%25bc%2F260"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2F%25e3%2582%25b5%25e3%2583%25bc%25e3%2583%2590%25e3%2583%25bc%2F260&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>先日から社内がMongoDB一色です。どうもこんにちは、岩本＠サーバー事業部です。</p>
<p>とゆうわけで、MongoDBのバックアップスクリプト書きました。</p>
<p>弊社はサーバー監視にNagiosを使っているので、通知部分にはNagios絡みのコマンドを書いてますが</p>
<p>適当に変更してお使いください。</p>
<blockquote><p>#!/bin/bash</p>
<p>OUTPUT=&#8221;/backup&#8221;<br />
MONGOBIN=&#8221;/usr/local/mongodb/bin&#8221;<br />
MONGOUSER=&#8221;ユーザー&#8221;<br />
MONGOPASS=&#8221;パスワード&#8221;<br />
PHASE=&#8221;DB Dump&#8221;<br />
FILEDATE=`date +&#8221;%Y-%m-%d&#8221; &#8211;date &#8220;1 day ago&#8221;`<br />
HOSTNAME=`hostname | cut -d &#8220;.&#8221; -f 1`</p>
<p>$MONGOBIN/mongodump -u $MONGOUSER -password=$MONGOPASS -o $OUTPUT/mongo_dump<br />
STATUS=$?<br />
if [ "$STATUS" = "0" ] ; then</p>
<p>PHASE=&#8221;Archive to Dump&#8221;<br />
cd $OUTPUT<br />
/bin/tar czvf $OUTPUT/mongodb_$FILEDATE.dump.tar.gz ./mongo_dump<br />
STATUS=$?<br />
rm -rf $OUTPUT/mongo_dump</p>
<p>if [ "$STATUS" = "0" ] ; then<br />
PHASE=&#8221;Backup is OK&#8221;<br />
# 成功時の通知<br />
/root/bin/check_result_via_nsca.sh  $HOSTNAME MONGODB_BACKUP 0 &#8220;$PHASE&#8221;<br />
fi</p>
<p>else<br />
# 失敗時の通知<br />
/root/bin/check_result_via_nsca.sh  $HOSTNAME MONGODB_BACKUP 2 &#8220;$PHASE&#8221;<br />
fi</p></blockquote>
<p><span style="color: #000000;">変なところがあれば、随時突っ込みください。</span></p>
<g:plusone href="http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/260"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/260/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS5.5 に MongoDBのインストール</title>
		<link>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/259</link>
		<comments>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/259#comments</comments>
		<pubDate>Thu, 25 Nov 2010 08:13:39 +0000</pubDate>
		<dc:creator>岩本＠サーバー事業部</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[サーバー]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/uncategorized/259</guid>
		<description><![CDATA[今年もあと1ヶ月と少しになりました。年をとる毎に1年てほんと早いよねぇーと、すっかり社内でももちきりです。 どうもこんにちは、岩本＠サーバー事業部です。 ソリューションぶのo2先輩より、とある案件で使うためサーバーに 「 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2F%25e3%2582%25b5%25e3%2583%25bc%25e3%2583%2590%25e3%2583%25bc%2F259"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2F%25e3%2582%25b5%25e3%2583%25bc%25e3%2583%2590%25e3%2583%25bc%2F259&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">今年もあと1ヶ月と少しになりました。年をとる毎に1年てほんと早いよねぇーと、すっかり社内でももちきりです。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">どうもこんにちは、岩本＠サーバー事業部です。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">ソリューションぶのo2先輩より、とある案件で使うためサーバーに</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">「MongoDBをインストールしろ」とのご命令を受けましたので、その時のログです。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">MongoDBはコンパイルが必要なく、</span></p>
<blockquote><p><span style="font-family: 'Meiryo UI'; font-size: x-small;"># cd /usr/local/src<br />
# wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.4.tgz<br />
# tar zxvf mongodb-linux-i686-1.6.4.tgz<br />
# mv mongodb-linux-i686-1.6.4 mongodb<br />
# mv mongodb /usr/local</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"># /usr/local/mongodb/bin/mongod</span></p></blockquote>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">以上！</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">って言ったら怒られたので、ここから起動スクリプトの作成。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><a href="http://ringio-blog.appspot.com/2010/10/mongodb-startup-script"><span style="font-family: 'Meiryo UI'; font-size: x-small;">http://ringio-blog.appspot.com/2010/10/mongodb-startup-script</span></a></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">こちらのサイトを参考にさせていただきました。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;">lockファイルがあると、うまく起動しない時があるらしく、lockファイルを消す処理を入れました。</span></p>
<p><span style="font-family: 'Meiryo UI'; font-size: x-small;"> </span></p>
<p># vi /etc/init.d/mongod</p>
<blockquote><p>#!/bin/sh<br />
#<br />
# chkconfig: &#8211; 85 15<br />
# description: MongoDB daemon<br />
#   #<br />
# pidfile: /var/run/mongod.pid<br />
# config: /etc/.conf</p>
<p># Source function library.<br />
. /etc/rc.d/init.d/functions</p>
<p># parameter<br />
mongoHome=/usr/local/mongodb<br />
mongod=${mongoHome}/bin/mongod<br />
mongodbpath=/var/mongodb<br />
logfile=/var/log/mongod.log<br />
pidfile=/var/run/mongod.pid<br />
mongoconf=/etc/mongodb.conf</p>
<p>RETVAL=0</p>
<p>start() {<br />
KIND=&#8221;MongoDB&#8221;</p>
<p>if test -e ${pidfile} ; then<br />
echo &#8220;already running&#8221;</p>
<p>else<br />
if test -e ${mongodbpath}/mongod.lock ; then<br />
rm -f ${mongodbpath}/mongod.lock<br />
fi</p>
<p>echo -n $&#8221;Starting $KIND services: &#8221;</p>
<p>${mongod} &#8211;pidfilepath=${pidfile} &#8211;dbpath=${mongodbpath} &#8211;logappend &#8211;logpath=${logfile} &#8211;config=${mongoconf} &#8211;fork<br />
RETVAL=$?<br />
echo<br />
[ $RETVAL -eq 0 ] &amp;&amp; touch ${mongodbpath}/mongod.lock || RETVAL=1<br />
return $RETVAL<br />
fi<br />
}</p>
<p>stop() {<br />
echo<br />
KIND=&#8221;MongoDB&#8221;<br />
echo -n $&#8221;Shutting down $KIND services: &#8221;<br />
killproc $mongod<br />
RETVAL=$?<br />
[ $RETVAL -eq 0 ] &amp;&amp; rm -f ${mongodbpath}/mongod.lock ${pidfile}<br />
echo &#8220;&#8221;<br />
return $RETVAL<br />
}</p>
<p>restart() {<br />
stop<br />
start<br />
}</p>
<p>status() {<br />
KIND=&#8221;MongoDB&#8221;</p>
<p>if test -e ${pidfile} ; then<br />
echo &#8220;mongod is running&#8221;<br />
echo &#8220;if mongod could not run, please remove pidfile&#8221;<br />
else<br />
echo &#8220;mongod is not running&#8221;<br />
fi<br />
}</p>
<p>case &#8220;$1&#8243; in<br />
start)<br />
start<br />
;;<br />
stop)<br />
stop<br />
;;<br />
restart)<br />
restart<br />
;;<br />
status)<br />
status<br />
;;<br />
*)<br />
echo $&#8221;Usage: $0 {start|stop|status|restart}&#8221;<br />
exit 2<br />
esac</p>
<p>exit $?</p></blockquote>
<p>さらに、認証の設定</p>
<p># vi /etc/mongodb.conf</p>
<blockquote><p>noauth = false<br />
auth = true</p></blockquote>
<p>DBユーザーの作成</p>
<blockquote><p># mongo<br />
&gt; use admin<br />
&gt; db.addUser(&#8220;username&#8221;, &#8220;password&#8221;)</p></blockquote>
<p>ユーザー認証の確認</p>
<blockquote><p># mongo<br />
&gt; db.auth(&#8220;username&#8221;, &#8220;password&#8221;)</p></blockquote>
<p style="margin-right: 0px;" dir="ltr">
<p style="margin-right: 0px;" dir="ltr">以上。これで、o2氏にもご納得いただけたかと。</p>
<p style="margin-right: 0px;" dir="ltr">変なところがあれば、ご指摘頂けると幸いです。</p>
<g:plusone href="http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/259"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc/259/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ぐるなび位置情報をMongoDBに保存</title>
		<link>http://labs.infoalive.com/mongodb/212</link>
		<comments>http://labs.infoalive.com/mongodb/212#comments</comments>
		<pubDate>Tue, 02 Nov 2010 13:07:12 +0000</pubDate>
		<dc:creator>o2</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labs.infoalive.com/?p=212</guid>
		<description><![CDATA[久しぶりに会社のブログを書きます。 １年ぶりになるでしょうか。。 最近はMongoDBに興味があって触っています。 MongoDBの紹介兼ねてインストールと、簡単なプログラムを書きました。 MongoDBはトランザクショ [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Flabs.infoalive.com%2Fmongodb%2F212"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Flabs.infoalive.com%2Fmongodb%2F212&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>久しぶりに会社のブログを書きます。<br />
１年ぶりになるでしょうか。。</p>
<p>最近はMongoDBに興味があって触っています。<br />
MongoDBの紹介兼ねてインストールと、簡単なプログラムを書きました。</p>
<p>MongoDBはトランザクション、テーブルjoin、auto incrementを使えませんが、高速でスケーラビリティな点が注目されているDBです。<br />
MongoDBはJSON形式でデータを扱い、JavaScriptの記述でデータを操作します。</p>
<p>では早速インストール。<br />
ubuntu 10.10だと以下でインストール出来ます。</p>
<blockquote><p><code>// 参考： http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages<br />
$ sudo apt-add-repository 'deb http://downloads.mongodb.org/distros/ubuntu 10.10 10gen'<br />
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10<br />
$ sudo aptitude install mongodb-stable<br />
<br />
$ mongo --version<br />
MongoDB shell version: 1.6.4<br />
<br />
// 自動起動設定<br />
$ runlevel<br />
N 2<br />
$ sudo sysv-rc-conf</code></p></blockquote>
<p>
早速位置情報からやってみます。<br />
位置情報はMongoDBのv1.3.3から対応しています。<br />
次の操作は、DBに位置情報を登録し、位置情報として扱うようにIndexを貼り、データの取得を実行します。</p>
<blockquote><p><code>$ mongo<br />
&gt; db.map.insert( { loc: {lat:35.705969 , lng: 139.74884} } );<br />
&gt; db.map.ensureIndex( { loc : "2d" } )<br />
&gt; db.map.find( { loc : { $near : [35.705969,139.74884] } } ).limit(20)</code></p></blockquote>
<p>
次に、PHPでぐるなびの位置情報を収集して、MongoDBに格納する処理。<br />
先にPHPにmongodbのライブラリを導入。</p>
<blockquote><p><code>$ sudo pecl install mongo<br />
$ sudo vi /etc/php5/conf.d/mongodb.ini<br />
extention=mongo.so<br />
</code></p></blockquote>
<p>Services_Gnaviのライブラリは http://lab.totoro.ws/gnavi/ のサイトからダウンロードしました。<br />
- gnavi.php</p>
<blockquote><p><code>&lt;?php<br />
require('Services/Gnavi.php');<br />
<br />
// -- 設定 --<br />
$access_key = 'ぐるなびアクセスキー';<br />
$rows = 999;<br />
$mongo = new Mongo("localhost:27017");<br />
$db = $mongo->selectDB( "MyDB" );<br />
$col = $db->selectCollection( "gnavi" );<br />
// -- 設定 --<br />
<br />
$gnavi = new Services_Gnavi($access_key);<br />
<br />
$gnavi->searchSubcategory();<br />
$cate = $gnavi->getResult();<br />
$_cate = $cate['category_s'];<br />
<br />
foreach(range(1,47) as $num){<br />
  $pref = sprintf("PREF%02d",$num);<br />
  $opt = array('pref'=> $pref, 'hit_per_page' => $rows,'offset_page' => 1, 'coordinates_mode' => 2);<br />
  print $pref . "\n";<br />
  foreach($_cate as $r){<br />
    $opt['category_s'] = $r['category_s_code'];<br />
    $res = getGnavi($gnavi,$opt);<br />
    print " " . $opt['category_s'];<br />
    if ($res['total_hit_count'] == 1) $res['rest'] = array($res['rest']);<br />
    save($col,$res['rest']);<br />
  }<br />
  print "\n";<br />
}<br />
print "End\n";<br />
<br />
function save($col,$res){<br />
  if (!$res) return;<br />
  $fmt = 'name,name_kana,address,tel,pr,code,category';<br />
  $fmt = split(',',$fmt);<br />
  foreach($res as $row){<br />
    $doc = array();<br />
    foreach($fmt as $key){<br />
      $doc[$key] =  $row[$key];<br />
    }<br />
    // 位置情報<br />
    $doc['loc'] = array('lat' => (double)$row['latitude'],'lng'=> (double)$row['longitude']);<br />
    $col->insert( $doc );<br />
  }<br />
}<br />
<br />
function getGnavi($gnavi,$opt){<br />
  $gnavi->searchRestaurant($opt);<br />
  return $gnavi->getResult();<br />
}<br />
</code></p></blockquote>
<p>以上でぐるなびの情報がMongoDBに格納できました。<br />
<br />
次に、実際にPHPから取得します。<br />
位置情報のパラメーターは以下になります。<br />
$near 現在地から近い位置情報を検索<br />
$box 長方形の範囲内の位置情報を検索<br />
$center 中心から半径の距離に含まれる位置情報を検索</p>
<p>- maps.php</p>
<blockquote><p><code>&lt;?php<br />
$mongo = new Mongo("localhost:27017");<br />
$db = $mongo-&gt;selectDB( "MyDB" );<br />
$col = $db-&gt;selectCollection( "gnavi" );<br />
//$query['loc']['$near'] = array(35.705969,139.74884); // 東京<br />
//$query['loc']['$near'] = array(43.068887774169625, 141.3720703125); // 北海道<br />
$query['loc']['$near'] = array(35.47856499535729, 134.241943359375); // 鳥取<br />
$cursor = $col->find($query)->limit(20);<br />
<br />
while( $cursor-&gt;hasNext() ) {<br />
  var_dump( $cursor-&gt;getNext() );<br />
}</code></p></blockquote>
<p>
とても簡単な記述で、位置情報の取得が出来ました。<br />
コードが簡潔に書けると嬉しくなります。</p>
<p>以上です。</p>
<p>○後日談<br />
ぐるなびの小業態は複数選択可能なパラメータだったので店舗情報が重複していた。<br />
MongoDBには重複した情報をINDEX設定時に削除出来るので、以下の作法で解消。</p>
<blockquote><p><code><br />
> db.gnavi.count();<br />
122726<br />
> db.gnavi.dropIndexes();<br />
> db.gnavi.ensureIndex( {  name: 1 , address: 1 }  , { unique: true, dropDups: true } );<br />
> db.gnavi.count();<br />
58448<br />
> db.gnavi.dropIndexes();<br />
> db.gnavi.ensureIndex( { loc: "2d" } );<br />
</code></p></blockquote>
<g:plusone href="http://labs.infoalive.com/mongodb/212"></g:plusone>]]></content:encoded>
			<wfw:commentRss>http://labs.infoalive.com/mongodb/212/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

