Your SlideShare is downloading. ×
0
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
はじめてのMongoDB
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

はじめてのMongoDB

1,513

Published on

社内勉強会での発表資料です

社内勉強会での発表資料です

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,513
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. はじめてのMongoDB 2013/09/18 TechCircle IT基盤サービス企画室 泉谷圭祐
  • 2. アジェンダ MongoDBとは MongoDBの特徴 MongoDBの基本 MongoDBの操作 MongoDBの運用 まとめ
  • 3. MongoDBとは 米10gen社が開発しているオープンソースNoSQLデータベース 2009年2月に初回リリース 最新版は2.4.6 C++で書かれている
  • 4. !?
  • 5. MongoDBとは 公式サイト http://www.mongodb.org/
  • 6. MongoDBの特徴 ドキュメント指向データベース アドホッククエリが使える 高い可用性 多数のメジャーな言語でAPIを提供
  • 7. MongoDBの特徴 ドキュメント指向データベース JSONでデータを保存 スキーマレス {❴ }❵ id : "1" name : "hoge" age : "25" email : "hoge@tis.co.jp" company : {❴ name : "TIS" address : "新宿区西新宿8-17-1 }❵ ※厳密にはBSON(❨Binary JSON)❩で保存される
  • 8. MongoDBの特徴 アドホッククエリが使える RDBライクな操作が可能 > db.user.findOne(❨{❴"name" : "hoge"}❵)❩ ! {❴ "id" : "1", "name" : "hoge", "email" : "hoge@tis.co.jp" }❵
  • 9. MongoDBの特徴 高い可用性 レプリカセット Cluster Node Node Node Node
  • 10. MongoDBの特徴 多数のメジャーな言語でAPIを提供 C Erlang PHP C++ Java Python C# Javascript Ruby Go Node.js Scala
  • 11. MongoDBの特徴 統一的なインターフェースを提供 Ruby require 'mongo' ! db = MongoClient.new(❨'localhost', '27017')❩.db(❨'mydb')❩ collection = db.collection(❨'test_col')❩ ! documents = collection.find(❨'name' => 'hoge')❩ Java import com.mongodb."いろいろ" ! DB db = new MongoClient(❨ "localhost" , 27017 )❩.getDB(❨"mydb")❩; DBCollection collection = db.getCollection(❨"test_coll")❩; ! BasicDBObject query = new BasicDBObject(❨"name", "hoge")❩; DBCursor documents = collection.find(❨query)❩;
  • 12. MongoDBの基本 データベースの表現について ドキュメントについて Mongo Console
  • 13. MongoDBの基本 データベースの表現について MySQL MongoDB DatabaseA DatabaseA TableA CollectionA TableB CollectionB DatabaseB TableC DatabaseB CollectionC
  • 14. MongoDBの基本 1レコード=1ドキュメント {❴ MongoDB DatabaseA CollectionA _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" }❵ {❴ CollectionB _id : ObjectId(❨"523444c714a05837e26ca8a1")❩ name : "huga" age : "30" email : "huga@tis.co.jp" }❵ DatabaseB CollectionC {❴ _id : ObjectId(❨"523444c714a05837e26ca8a2")❩ name : "foo" age : "32" phone : "090-1234-5678" <= !?
  • 15. MongoDBの基本 ドキュメントについて {❴ }❵ _id : ObjectId(❨"523444c714a05837e26ca8a0")❩ name : "hoge" age : "25" email : "hoge@tis.co.jp" language : ["Japanese", "English"] home : {❴ name : "hoge apart" address : "新宿区西新宿1-1-1" }❵ "updatedAt" : ISODate(❨"2013-09-18T18:00:15.598Z")❩ 自動でidが割り振られる(❨DBで一 意)❩ 配列を要素にできる 入れ子にすることもできる 時刻を入れることもできる コレクション内で要素が異なっていても良い 1ドキュメントのサイズはBSONで16MBまで
  • 16. MongoDBの基本 Mongo Console MongoDBのコンソールはJavascriptで実装されている [hogeuser@localhost]$ mongo MongoDB shell version: 2.4.6 connecting to: test ! > > var test = db.test.find(❨)❩.length(❨)❩; > > print(❨test)❩ 3 > 標準API以外に変数やメソッドを使った操作も可能
  • 17. MongoDBの操作 ドキュメントの作成 ドキュメントの参照 ドキュメントの更新 ドキュメントの削除
  • 18. MongoDBの操作 ドキュメントの作成 > use test #DBの指定 > db.test_collection.insert(❨{❴ "name" : "hoge", "email" : "hoge@tis.co.jp" }❵)❩; > コレクションはuse等する必要がない データベースもコレクションも初めてドキュメントを追加した時に
 自動で作成される
  • 19. MongoDBの操作 ドキュメントの参照 ! #全件検索 > db.test_collection.find(❨)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! # クエリ検索 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #1件検索 > db.test_collection.findOne(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge",
  • 20. MongoDBの操作 ドキュメントの更新 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #更新 > db.test_collection.update(❨{❴"name":"hoge"}❵, {❴$set : {❴"email" : "hoge@excale.net"}❵}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩;
  • 21. MongoDBの操作 ドキュメントの削除 ! #事前状態 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; {❴ "_id" : ObjectId(❨"5234628337f4ddc7fa170918")❩, "name" : "hoge", "email" : "hoge@tis.co.jp" }❵ > ! #削除 > db.test_collection.remove(❨{❴"name":"hoge"}❵)❩; ! #結果確認 > db.test_collection.find(❨{❴"name":"hoge"}❵)❩; ・・・?
  • 22. MongoDBの操作 mongoDBにはトランザクションがない!! > db.test_collection.remove(❨)❩;
  • 23. MongoDBの操作 Demo
  • 24. MongoDBの運用 レプリカセット シャーディング その他の機能
  • 25. MongoDBの運用 レプリカセット 複数台のノードでクラスタを組んでミラーリング PRIMARY1台、他はすべてSECANDARY 書き込みはPRIMARYで行う PRIMARYが落ちたら投票が行われ、
 次のPRIMARYが選出される
 (❨10∼20のダウンタイムが発生)❩ ノード数は奇数が推奨されている
  • 26. MongoDBの運用 Demo
  • 27. MongoDBの運用 シャーディング 複数台のレプリカセットクラスタでデータを分割
  • 28. MongoDBの運用 シャーディング構成図
  • 29. MongoDBの運用 シャーディング構成 シャード 通常はレプリカセットで構成する コンフィグサーバー 1台か3台で構成(プロダクションでは3台構成とされている) 勝手に同期しているのでレプリカセットにする必要はない ルーティングサーバー(❨mongos)❩ mongoを使う各サーバー自身が持つ コンフィグサーバーに問い合わせをして読み書きを分散
  • 30. MongoDBの運用 その他の機能 ダンプ / リストア cappedコレクション TTLインデックス MapReduce
  • 31. MongoDBの運用 ダンプ / リストア ユーティリティが付属 $ mongodump --collection "COLLECTION_NAME" --db "DB_NAME" $ mongorestore --collection "COLLECTION_NAME" --db "DB_NAME"
  • 32. MongoDBの運用 cappedコレクション サイズ制限付きのコレクション 容量もしくはドキュメント数の制限をかけられる 古いものから自動的に削除される ※シャーディング環境では使えません
  • 33. MongoDBの運用 TTL index 保持期限付きのコレクション 時刻型のフィールドが必要 古いものから自動的に削除される
  • 34. MongoDBの運用 MapReduce APIを叩くことで実行可能 #初期データ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a0")❩, "name" : "hoge", "age" : 25, "likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a1")❩, "name" : "huga", "age" : 30, "likes" : "sport" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a2")❩, "name" : "foo", "age" : 40,"likes" : "music"}❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a3")❩, "name" : "bar", "age" : 21, "likes" : "coding" }❵)❩ > db.test.insert(❨{❴ "_id" : ObjectId(❨"523444c714a05837e26ca8a4")❩, "name" : "test", "age" : 19, "likes" : "sport" }❵)❩ ! > var map = function(❨)❩{❴ emit(❨this.likes,1)❩; }❵; > > var reduce = function(❨key, value)❩{❴ return Array.sum(❨value)❩; }❵; > > db.test.mapReduce(❨map, reduce, {❴ query : {❴"age" : {❴$gt : 20}❵}❵, out : "likes_map"}❵)❩ ! /* 結果サマリ(省略)*/
  • 35. MongoDBの運用 その他にも GridFS 地理空間インデックス など、便利な機能がある
  • 36. まとめ MongoDBのいいところ スキーマレス アドホッククエリ 冗長化が楽 便利な機能が豊富 コミュニティが活発
  • 37. まとめ MongoDBのイケてないところ トランザクションがない 結合がない、外部キーがない 悪い意味でスキーマレス 運用面で苦労話の が。。。
  • 38. まとめ NoSQL全般に言えることだが。。。 新しい万能兵器ではない 限られた使い所で効力を発揮 非正規型データが大量にある場合 データ構造が確定していない場合
  • 39. 興味を持った方は うちのリーダーが書いた記事を参考にまずはインストールから http://codezine.jp/article/ detail/6982
  • 40. 御静聴ありがとうございました eXcaleもよろしくお願いします https://www.excale.net/

×