SlideShare a Scribd company logo
mongoDB のご紹介 インフォサイエンス 永江 哲朗
mongoDB とは  (※) [ 開発元 ] 10gen [ 実装 ] C++  [ タイプ ]  ドキュメント指向データベース [OS] Windows, Linux, OS X, Solaris でバイナリ配布 [ 言語サポート ] ( 公式 ) C, C++, C#, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala [ ライセンス ]     DB: GNU AGPL v3.0 もしくは商用ライセンス  各種言語用ドライバー : Apache License v2 ※  [Wikipedia]
mongoDB の歴史 ・ PAAS を開始するため、 2007 年に 10gen はアプリケーションサーバーと DB を統合し、 web アプリケーションをホスティングするためのスケール性の高いソフトウェアを開発しました。 その後 PAAS はうまく行きませんでしたが、 DB のスケーラビリティ性と開発のしやすさにユーザーが注目。 10gen は DB に注力し、 2009 年 2 月に MongoDB としてリリースしました。 (※1) ・現在の最新版は 1.8.1 (2011 年 5 月 26 日現在 )  です。 (※2) ※ 1 [Banker] p.6 ※ 2 [Mongo]
mongoDB の特徴  (※1) ※ 2  シャーディング :  データベース内のテーブルのデータを複数のシャード ( 破片 ) サーバーにまたがって分散させる方法 ※ 1 [Inoue-1] p.6 MapReduce 機能内蔵 [MapReduce] 二次元の地理空間のインデックス (geospatial index) を持つ [ 地理空間のインデックス ] マスター・スレーブ構成。自動フェイルオーバー [ レプリケーション ] あらゆる属性でインデックス作成 [ インデックスサポート ] あらゆるカラムで条件指定可能 [ クエリ ] 自動シャーディング。ただし適切なシャーディングキーを管理者が指定する必要があります [ シャーディング  (※2)] JSON ( 内部では BSON(Binary JSON)) [ ドキュメント指向 DB]
{ _id: ObjectID('4bd9e8e17cefd644108961bb'),  title: 'Adventures in Databases', url: 'http://example.com/databases.txt', author: 'msmith', vote_count: 20, tags: ['databases', 'mongodb', 'indexing'],  image: {  url: 'http://example.com/db.jpg', caption: '', type: 'jpg', size: 75381, data: "Binary"   }, comments: [  {user: 'bjones',     text: 'Interesting article!' }, {user: 'blogger',   text: 'Another related article is at http://example.com/db/db.txt' } ]  }  ドキュメントのデータモデル  (※1) ※ 1 [Banker] p.7 ドキュメントは RDB でいう行に相当します。 ( したがって左のデータは RDB での 1 行に相当します ) ドキュメントのデータは JSON (JavaScript Object Notation)  で表されます。 ( 内部では BSON(Binary JSON) で格納されます ) _id  というフィールドはプライマリキーになります。 値として配列をもつこともできます。
mongoDB の用語 ノード データベース コレクション ドキュメント コレクション コレクション データベース コレクションの集合です。 データベース  (database) RDB ではテーブルに相当します。 コレクション  (collection) RDB では行 (row) に相当します。 ドキュメント  (document) 説明 MongoDB での用語
mongoDB でのクエリ  (1) ・ users というコレクションで” username” が” joe” であるドキュメントの” username” と” email” の値を検索するときのクエリ    > db.users.find({“username” : “joe”}, {“username” : 1, “email” : 1}) { “ _id” : ObjectId(“4ba0f0dfd22aa494fd523620”), “ username” : “joe”, “ email” : joe@example.com } ・同じく users で、年齢が 18 ~ 30 歳のドキュメントを検索する場合 > db.users.find({“age” : { “$gte” : 18, “$lte” : 30}}) ($gte  は “≧” , $lte  は “≦”を表します。 $ のつく演算子は他にもたくさんあります ) ・正規表現を使った検索    > db.users.find({“name” : /joey?/}) (“y?” は、 y が 0 文字もしくは 1 文字を表しますので、例えば” joe” と” joey” の両方にマッチします )
mongoDB でのクエリ  (2)  配列  (※) products というコレクションに以下のようなドキュメントがあるとします。 { _id:  ObjectId("4c4b1476238d3b4dd5003981"), slug: "wheel-barrow-9092", sku:  "9092", tags: [“tools”, “equipment”, “soil”]  (←  タグ (tags) を配列で表現 ) } このドキュメントをタグ (tags) に” soil” が含まれるという条件で検索したい場合:   > db.products.find({tags: "soil"}) このクエリは tags フィールドにインデックスを張っていれば効率がよくなります。   > db.products.ensureIndex({tags: 1}) ※  [Banker] p.106
mongoDB のインデックス ・インデックスを作るには、 ensureIndex メソッドを使います。    > db.people.ensureIndex({“username” : 1}) ・ username は昇順で、 age は降順のインデックスを作成する場合 : > db.people.ensureIndex({“username” : 1, “age”: -1}) (“1” が昇順を、” -1” が降順を表します ) ・ユニークインデックスを作成する場合 :    > db.people.ensureIndex({“username” : 1}, {“unique” : true}) ただし、 insert のデフォルトの動作としては、その insert 文によってドキュメントが実際に追加されたかどうかチェックしません。   そのため、重要なデータの場合には各ドライバの  getlasterror  コマンドでチェックするか、ドライバの “ safe”  モードを使う必要性が出てきます。 ※  [Chodorow&Dirolf] chapter 5. Indexing
mongoDB でのインサート  ・ users という中身のないコレクションに” username” が” smith” というドキュメントを追加する場合 > db.users.insert({“username” : “smith”}) > db.users.find() { “ _id” : ObjectId(“4ba0f0dfd22aa494fd523623”), “ username” : “smith”, }   -> “ _id” の値はクライアント ( ドライバー ) で作成され、 mongoDB に格納されます。
mongoDB での更新 ・ユーザー” smith” のドキュメントに、国 “ Canada” を追加する場合    > db.users.update({“username” : “smith”), {$set: (“country”: “Canada”}}) ($set をつけないと、” username”=“smith” のドキュメントがすべて上書きされてしまいます ) ・ mongoDB はスキーマフリーなので、スキーマ構成変更命令なしで以下のような update を実行できます。 > db.users.update( {“username”: "smith"},  { $set: {“favorites”: { “ cities”: ["Chicago", "Cheyenne"], “ movies”: ["Casablanca", "The Sting"] }  }  });
mongoDB での削除 ・ users コレクションから favorite.city が” Cheyenne” のドキュメントを削除する場合    > db.users.remove({"favorites.cities": "Cheyenne"}) ・ users コレクションをまるごと削除する場合    > db.users.remove({ })
ジャーナリング  (※) ・ version1.8 から、ジャーナリング機能が導入されました。ジャーナリング機能が有効化されると、 mongoDB はデータファイルに書き込む前に、そのデータをジャーナルに書き込むようになります。 ・ジャーナル機能が無効の場合 : mongoDB はデータファイルをヴァーチャルメモリーにマップしており、ヴァーチャルメモリーを定期的にディスクに書き込みます。従ってサーバーが突然停止してしまった場合、メモリ上のデータは失われます。 ・ジャーナリング機能はデフォルトの設定では 100ms 間隔でメモリの内容をディスクに書き込みます。従ってデフォルト設定の場合、サーバー停止によって最大で 100ms ぶんのデータロストが発生します。 ※  [Banker] p.265
レプリケーション  (1) (※) ・レプリカセット  ・レプリカセットは非同期なマスター / スレーブ構成のレプリケーションで、自動的なフェイルオーバー機能をもちます。  ・プライマリ ( マスター ) ノードが存在しない場合、レプリカセットは自動的にプライマリを選出します。  ・各言語のドライバーはプライマリが変わったことを検知し、新しいプライマリノードに書込みリクエストを送信します。 ※  [Mongo] Replica Sets (http://www.mongodb.org/display/DOCSJP/Replica+Sets), (http://www.mongodb.org/display/DOCS/Replica+Sets)
レプリケーション  (2) (※) ・レプリカセットのフェイルオーバー  (1) 2 台構成の場合   ※  [Chodorow&Dirolf] p.130-p.131  (1)  通常状態。 プライマリはセカンダリに対してデータを同期します。   (2)  プライマリ停止。 プライマリが停止すると、セカンダリがプライマリを引継ぎます。   (3)  旧プライマリ再起動。 旧プライマリが起動すると、新プライマリがセカンダリ ( 旧プライマリ ) にデータを同期します。   (1)    (2)    (3)   
レプリケーション  (3) (※) ・レプリカセットのフェイルオーバー  (2) 5 台構成の場合 ※  [Chodorow&Dirolf] p.135-p.136  (1)  通常状態。 プライマリはセカンダリに対してデータを同期します。   (2)  プライマリ停止。 プライマリが停止すると、最もプライオリティが高いノード間でどれが最新のデータをもつかが比較されます。 (3)  データ同期の再開。 新プライマリはセカンダリノードにデータを同期します。   (1)    (2)    (3)   
・シャーディング機能 : MongoDB はデータベースやコレクション、コレクション内のオブジェクトを、シャーディングキーに基づき、複数のシャードにまたがって、ダウンタイムなしで自動的に配布します。 ・ mongos:  クライアントからのリクエストをそれぞれのシャードにルーティングします。 ・ config server:  どのシステムにどんなシャードが存在しているかといったような、クラスタのメタデータを保存します。 シャーディング  (※) ※  [Mongo] Sharding  (http://www.mongodb.org/display/DOCSJP/Sharding),  Sharding Introduction (http://www.mongodb.org/display/DOCS/Sharding+Introduction) レプリカセット
mongoDB のユースケース  (1)  (※) ●  向いているケース (1) web サイトの操作データの蓄積   リアルタイムの insert, update,  クエリ  スケーラビリティとレプリケーション ->  例 . -  コンテンツ管理  (Web コンテンツを構成するテキストや画像、レイアウト情報などを一元的に保存・管理 ) -  コメントの格納、管理、投票 -  ユーザー登録、プロファイル、セッションデータ等の格納 (2)  キャッシング  (3)  大量データ (4)  プログラムのオブジェクトと JSON のデータ ( または同等のもの ) の格納 (5)  リアルタイム統計 / 解析 (6)  アーカイブとイベントのログ取得 ※  [Mongo] Use Cases  (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
mongoDB のユースケース  (2)  (※) ●  あまり向いていないところ (1)  銀行系のように複雑なトランザクションに重点を置くシステム - mongoDB は単一のドキュメントに対するアトミックな操作はサポートしていますが、マルチ・オブジェクト・トランザクションをサポートしていません。 (2)  伝統的なビジネスインテリジェンス (BI) - mongoDB はリアルタイムにデータを計算したり集約したりするのに向いていますが、夜間にバッチで動かすような BI には向いていません。 (3) SQL を必要とする問題   - mongoDB は SQL をサポートしていません。 ※  [Mongo] Use Cases  (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
mongoDB はどんなところで使われているか (1-1) (※) ・ foursquare  foursquare はスマートフォンの GPS 機能を使った位置情報 SNS です。 [Nikkei-Trendy]   ・お店や駅など、自分がいる場所でチェックインすると、自分の場所がネット上に登録され、友人に公開されます。   ・ Tips といって自分の訪れたお店や施設について情報を書き込み、それを他の人が読むことができる機能があります。   ・他にも「品川駅に来たらこの店に行く」などとタスクを書いておくと、品川駅近辺でチェックインしたときにタスクを自動的に通知してくれる To-Do List 機能もあります。 ※  [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
mongoDB はどんなところで使われているか (1-2)  ・ foursquare ( 続き ) foursquare では、 25 台以上の Amazon EC2 サーバー上のシャーディングした mongoDB に、ユーザーの”チェックイン”情報を格納しています。また、お店や駅などの場所の情報に、 mongoDB の地理空間インデックスを使っています。 (※) ( 例 )  基本的なクエリ 与えられた位置情報に近いお店や施設を 20 個みつける場合  > db.venues.find({latlng: {$near: [40.72, -73.99]}).limit(20) ※  [Heymann] p8 現在地 …
mongoDB はどんなところで使われているか (2)  ・ Ameba Pico ( 仮想空間サービス「アメーバピグ」の海外版 )   Ameba Pico では、 AWS と以下の 技術を使用しています。 (※1 。図も ) - MongoDB  - node.js  - WebSocket  - Flash Player ※ 1 [Namura] p.6, p.9 ※ 2 [AmebaPico] スクリーンショット  (※2)
mongoDB はどんなところで使われているか (3)  (※)  ・ intuit  intuit では、小規模ビジネス用の web サイトにおいて、ユーザーの活動状況をリアルタイムに記録するのに mongoDB を使用しています。 mongoDB は、 craigslist, sourceforge, NY times, Springer, Taobao,  サイバーエージェント等の有名な会社、組織で多数採用されています。 ※  [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
参考文献 ・ [Mongo] MongoDB ホームページ (http://www.mongodb.org/)  ・ [Chodorow&Dirolf] ”MongoDB: The Definitive Guide”, Kristina Chodorow & Michael Dirolf, 2010, O’reilly ・ [Banker] ”MongoDB in Action”, Kyle Banker, 2011, Manning MEAP Edition version 8 ・ [Inoue-1] ”MongoDB  全機能解説 (1)”,  井上 敬浩 , 2011, MongoDB 勉強会 第 3 回 資料  (http://www.slideshare.net/doryokujin/mongodb1) ・ [Namura] “MongoDB + node.js  で作るソーシャルゲーム” ,  名村 卓 , 2011, Mongo Tokyo 2011 資料  (http://www.slideshare.net/snamura/mongodb-nodejs) ・ [AmebaPico] “About Ameba Pico” (http://www.cyberagentamerica.com/games/) ・ [Wikipedia] Wikipedia 英語版  MongoDB (http://en.wikipedia.org/wiki/MongoDB) ・ [Nikkei-Trendy] “Twitter の次に来るのか、新世代ソーシャルサービス「 foursquare 」って何だろう?” , 日経トレンディネット , 2011/2/25 (http://trendy.nikkeibp.co.jp/article/pickup/20110223/1034598) ・ [Heymann] “Foursquare & MongoDB”, Harry Heymann, 2010 (https://docs.google.com/present/view?id=dhkkqm6q_13gm6jq5fv)

More Related Content

PDF
MongoDB〜その性質と利用場面〜
PDF
後悔しないもんごもんごの使い方 〜アプリ編〜
PDF
DB tech showcase: 噂のMongoDBその用途は?
PDF
MongoDBざっくり解説
PPTX
がっつりMongoDB事例紹介
PDF
MongoDB very basic (Japanese) / MongoDB基礎の基礎
PDF
Introduction to MongoDB
PPTX
初心者向けMongoDBのキホン!
MongoDB〜その性質と利用場面〜
後悔しないもんごもんごの使い方 〜アプリ編〜
DB tech showcase: 噂のMongoDBその用途は?
MongoDBざっくり解説
がっつりMongoDB事例紹介
MongoDB very basic (Japanese) / MongoDB基礎の基礎
Introduction to MongoDB
初心者向けMongoDBのキホン!

What's hot (20)

PPTX
MongoDB World 2014に行ってきた!
PDF
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
PPTX
MongoDBが遅いときの切り分け方法
PDF
Case study to use MongoDB in middle-class SIer / (中規模) SIerだってMongoDBできたよ!
PPTX
Mongo dbを知ろう
PPTX
MongoDBの監視
PDF
初めてのMongo db
PDF
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
PPTX
Mongo db勉強会の補足
PPT
ザ・ドキュメント~うまくいかないNoSQL~
PDF
Db tech showcase2015 how to replicate between clusters
PPTX
日本語:Mongo dbに於けるシャーディングについて
PDF
MongoDBのはじめての運用テキスト
PDF
NoSQLデータベースと位置情報
PDF
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
PPTX
MongoDB3.2の紹介
ODP
Mongo dbを半年ちょっと運用してみた
PDF
MongoDBのアレをアレする
PPTX
MongoDB on EC2 #mongodbcasual
MongoDB World 2014に行ってきた!
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
MongoDBが遅いときの切り分け方法
Case study to use MongoDB in middle-class SIer / (中規模) SIerだってMongoDBできたよ!
Mongo dbを知ろう
MongoDBの監視
初めてのMongo db
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Mongo db勉強会の補足
ザ・ドキュメント~うまくいかないNoSQL~
Db tech showcase2015 how to replicate between clusters
日本語:Mongo dbに於けるシャーディングについて
MongoDBのはじめての運用テキスト
NoSQLデータベースと位置情報
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
MongoDB3.2の紹介
Mongo dbを半年ちょっと運用してみた
MongoDBのアレをアレする
MongoDB on EC2 #mongodbcasual
Ad

Similar to MongoDB (20)

PDF
PHP開発者のためのNoSQL入門
PPT
Mongodb
PDF
RとSQLiteで気軽にデータベース作成
ODP
Mongo db勉強会
PDF
カウチなやつら CouchDB in the room
PDF
既存システムへの新技術活用法 ~fluntd/MongoDB~
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PPTX
Mongo db使ってみよう
PDF
Dat009 クラウドでビック
PDF
CouchDB JP & BigCouch
PPTX
Dat009 クラウドでビック
PPTX
BPStudy32 CouchDB 再入門
PPTX
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
PPTX
SQL Server 入門
PPTX
シラサギハンズオン 東京
PPTX
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
PDF
20190516_DLC10_PGStrom
PPTX
AWSで作る分析基盤
PPTX
シラサギハンズオン 1015 1016
PDF
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
PHP開発者のためのNoSQL入門
Mongodb
RとSQLiteで気軽にデータベース作成
Mongo db勉強会
カウチなやつら CouchDB in the room
既存システムへの新技術活用法 ~fluntd/MongoDB~
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
Mongo db使ってみよう
Dat009 クラウドでビック
CouchDB JP & BigCouch
Dat009 クラウドでビック
BPStudy32 CouchDB 再入門
[db tech showcase Tokyo 2017] A15: レプリケーションを使用したデータ分析基盤構築のキモ(事例)by 株式会社インサイトテ...
SQL Server 入門
シラサギハンズオン 東京
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
20190516_DLC10_PGStrom
AWSで作る分析基盤
シラサギハンズオン 1015 1016
マルチテナント Hadoop クラスタのためのモニタリング Best Practice
Ad

More from あしたのオープンソース研究所   (13)

MongoDB

  • 2. mongoDB とは (※) [ 開発元 ] 10gen [ 実装 ] C++ [ タイプ ] ドキュメント指向データベース [OS] Windows, Linux, OS X, Solaris でバイナリ配布 [ 言語サポート ] ( 公式 ) C, C++, C#, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala [ ライセンス ]     DB: GNU AGPL v3.0 もしくは商用ライセンス  各種言語用ドライバー : Apache License v2 ※ [Wikipedia]
  • 3. mongoDB の歴史 ・ PAAS を開始するため、 2007 年に 10gen はアプリケーションサーバーと DB を統合し、 web アプリケーションをホスティングするためのスケール性の高いソフトウェアを開発しました。 その後 PAAS はうまく行きませんでしたが、 DB のスケーラビリティ性と開発のしやすさにユーザーが注目。 10gen は DB に注力し、 2009 年 2 月に MongoDB としてリリースしました。 (※1) ・現在の最新版は 1.8.1 (2011 年 5 月 26 日現在 ) です。 (※2) ※ 1 [Banker] p.6 ※ 2 [Mongo]
  • 4. mongoDB の特徴 (※1) ※ 2 シャーディング : データベース内のテーブルのデータを複数のシャード ( 破片 ) サーバーにまたがって分散させる方法 ※ 1 [Inoue-1] p.6 MapReduce 機能内蔵 [MapReduce] 二次元の地理空間のインデックス (geospatial index) を持つ [ 地理空間のインデックス ] マスター・スレーブ構成。自動フェイルオーバー [ レプリケーション ] あらゆる属性でインデックス作成 [ インデックスサポート ] あらゆるカラムで条件指定可能 [ クエリ ] 自動シャーディング。ただし適切なシャーディングキーを管理者が指定する必要があります [ シャーディング (※2)] JSON ( 内部では BSON(Binary JSON)) [ ドキュメント指向 DB]
  • 5. { _id: ObjectID('4bd9e8e17cefd644108961bb'), title: 'Adventures in Databases', url: 'http://example.com/databases.txt', author: 'msmith', vote_count: 20, tags: ['databases', 'mongodb', 'indexing'], image: { url: 'http://example.com/db.jpg', caption: '', type: 'jpg', size: 75381, data: "Binary" }, comments: [ {user: 'bjones', text: 'Interesting article!' }, {user: 'blogger', text: 'Another related article is at http://example.com/db/db.txt' } ] } ドキュメントのデータモデル (※1) ※ 1 [Banker] p.7 ドキュメントは RDB でいう行に相当します。 ( したがって左のデータは RDB での 1 行に相当します ) ドキュメントのデータは JSON (JavaScript Object Notation) で表されます。 ( 内部では BSON(Binary JSON) で格納されます ) _id というフィールドはプライマリキーになります。 値として配列をもつこともできます。
  • 6. mongoDB の用語 ノード データベース コレクション ドキュメント コレクション コレクション データベース コレクションの集合です。 データベース (database) RDB ではテーブルに相当します。 コレクション (collection) RDB では行 (row) に相当します。 ドキュメント (document) 説明 MongoDB での用語
  • 7. mongoDB でのクエリ (1) ・ users というコレクションで” username” が” joe” であるドキュメントの” username” と” email” の値を検索するときのクエリ   > db.users.find({“username” : “joe”}, {“username” : 1, “email” : 1}) { “ _id” : ObjectId(“4ba0f0dfd22aa494fd523620”), “ username” : “joe”, “ email” : joe@example.com } ・同じく users で、年齢が 18 ~ 30 歳のドキュメントを検索する場合 > db.users.find({“age” : { “$gte” : 18, “$lte” : 30}}) ($gte は “≧” , $lte は “≦”を表します。 $ のつく演算子は他にもたくさんあります ) ・正規表現を使った検索   > db.users.find({“name” : /joey?/}) (“y?” は、 y が 0 文字もしくは 1 文字を表しますので、例えば” joe” と” joey” の両方にマッチします )
  • 8. mongoDB でのクエリ (2) 配列 (※) products というコレクションに以下のようなドキュメントがあるとします。 { _id: ObjectId("4c4b1476238d3b4dd5003981"), slug: "wheel-barrow-9092", sku: "9092", tags: [“tools”, “equipment”, “soil”] (← タグ (tags) を配列で表現 ) } このドキュメントをタグ (tags) に” soil” が含まれるという条件で検索したい場合:   > db.products.find({tags: "soil"}) このクエリは tags フィールドにインデックスを張っていれば効率がよくなります。   > db.products.ensureIndex({tags: 1}) ※ [Banker] p.106
  • 9. mongoDB のインデックス ・インデックスを作るには、 ensureIndex メソッドを使います。   > db.people.ensureIndex({“username” : 1}) ・ username は昇順で、 age は降順のインデックスを作成する場合 : > db.people.ensureIndex({“username” : 1, “age”: -1}) (“1” が昇順を、” -1” が降順を表します ) ・ユニークインデックスを作成する場合 :   > db.people.ensureIndex({“username” : 1}, {“unique” : true}) ただし、 insert のデフォルトの動作としては、その insert 文によってドキュメントが実際に追加されたかどうかチェックしません。   そのため、重要なデータの場合には各ドライバの getlasterror コマンドでチェックするか、ドライバの “ safe” モードを使う必要性が出てきます。 ※ [Chodorow&Dirolf] chapter 5. Indexing
  • 10. mongoDB でのインサート ・ users という中身のないコレクションに” username” が” smith” というドキュメントを追加する場合 > db.users.insert({“username” : “smith”}) > db.users.find() { “ _id” : ObjectId(“4ba0f0dfd22aa494fd523623”), “ username” : “smith”, }   -> “ _id” の値はクライアント ( ドライバー ) で作成され、 mongoDB に格納されます。
  • 11. mongoDB での更新 ・ユーザー” smith” のドキュメントに、国 “ Canada” を追加する場合   > db.users.update({“username” : “smith”), {$set: (“country”: “Canada”}}) ($set をつけないと、” username”=“smith” のドキュメントがすべて上書きされてしまいます ) ・ mongoDB はスキーマフリーなので、スキーマ構成変更命令なしで以下のような update を実行できます。 > db.users.update( {“username”: "smith"}, { $set: {“favorites”: { “ cities”: ["Chicago", "Cheyenne"], “ movies”: ["Casablanca", "The Sting"] } } });
  • 12. mongoDB での削除 ・ users コレクションから favorite.city が” Cheyenne” のドキュメントを削除する場合   > db.users.remove({"favorites.cities": "Cheyenne"}) ・ users コレクションをまるごと削除する場合   > db.users.remove({ })
  • 13. ジャーナリング (※) ・ version1.8 から、ジャーナリング機能が導入されました。ジャーナリング機能が有効化されると、 mongoDB はデータファイルに書き込む前に、そのデータをジャーナルに書き込むようになります。 ・ジャーナル機能が無効の場合 : mongoDB はデータファイルをヴァーチャルメモリーにマップしており、ヴァーチャルメモリーを定期的にディスクに書き込みます。従ってサーバーが突然停止してしまった場合、メモリ上のデータは失われます。 ・ジャーナリング機能はデフォルトの設定では 100ms 間隔でメモリの内容をディスクに書き込みます。従ってデフォルト設定の場合、サーバー停止によって最大で 100ms ぶんのデータロストが発生します。 ※ [Banker] p.265
  • 14. レプリケーション (1) (※) ・レプリカセット  ・レプリカセットは非同期なマスター / スレーブ構成のレプリケーションで、自動的なフェイルオーバー機能をもちます。  ・プライマリ ( マスター ) ノードが存在しない場合、レプリカセットは自動的にプライマリを選出します。  ・各言語のドライバーはプライマリが変わったことを検知し、新しいプライマリノードに書込みリクエストを送信します。 ※ [Mongo] Replica Sets (http://www.mongodb.org/display/DOCSJP/Replica+Sets), (http://www.mongodb.org/display/DOCS/Replica+Sets)
  • 15. レプリケーション (2) (※) ・レプリカセットのフェイルオーバー (1) 2 台構成の場合   ※ [Chodorow&Dirolf] p.130-p.131 (1) 通常状態。 プライマリはセカンダリに対してデータを同期します。   (2) プライマリ停止。 プライマリが停止すると、セカンダリがプライマリを引継ぎます。   (3) 旧プライマリ再起動。 旧プライマリが起動すると、新プライマリがセカンダリ ( 旧プライマリ ) にデータを同期します。   (1)   (2)   (3)  
  • 16. レプリケーション (3) (※) ・レプリカセットのフェイルオーバー (2) 5 台構成の場合 ※ [Chodorow&Dirolf] p.135-p.136 (1) 通常状態。 プライマリはセカンダリに対してデータを同期します。   (2) プライマリ停止。 プライマリが停止すると、最もプライオリティが高いノード間でどれが最新のデータをもつかが比較されます。 (3) データ同期の再開。 新プライマリはセカンダリノードにデータを同期します。   (1)   (2)   (3)  
  • 17. ・シャーディング機能 : MongoDB はデータベースやコレクション、コレクション内のオブジェクトを、シャーディングキーに基づき、複数のシャードにまたがって、ダウンタイムなしで自動的に配布します。 ・ mongos: クライアントからのリクエストをそれぞれのシャードにルーティングします。 ・ config server: どのシステムにどんなシャードが存在しているかといったような、クラスタのメタデータを保存します。 シャーディング (※) ※ [Mongo] Sharding (http://www.mongodb.org/display/DOCSJP/Sharding), Sharding Introduction (http://www.mongodb.org/display/DOCS/Sharding+Introduction) レプリカセット
  • 18. mongoDB のユースケース (1) (※) ● 向いているケース (1) web サイトの操作データの蓄積  リアルタイムの insert, update, クエリ  スケーラビリティとレプリケーション -> 例 . - コンテンツ管理 (Web コンテンツを構成するテキストや画像、レイアウト情報などを一元的に保存・管理 ) - コメントの格納、管理、投票 - ユーザー登録、プロファイル、セッションデータ等の格納 (2) キャッシング (3) 大量データ (4) プログラムのオブジェクトと JSON のデータ ( または同等のもの ) の格納 (5) リアルタイム統計 / 解析 (6) アーカイブとイベントのログ取得 ※ [Mongo] Use Cases (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
  • 19. mongoDB のユースケース (2) (※) ● あまり向いていないところ (1) 銀行系のように複雑なトランザクションに重点を置くシステム - mongoDB は単一のドキュメントに対するアトミックな操作はサポートしていますが、マルチ・オブジェクト・トランザクションをサポートしていません。 (2) 伝統的なビジネスインテリジェンス (BI) - mongoDB はリアルタイムにデータを計算したり集約したりするのに向いていますが、夜間にバッチで動かすような BI には向いていません。 (3) SQL を必要とする問題   - mongoDB は SQL をサポートしていません。 ※ [Mongo] Use Cases (http://www.mongodb.org/pages/viewpage.action?pageId=21266728) (http://www.mongodb.org/display/DOCS/Use+Cases)
  • 20. mongoDB はどんなところで使われているか (1-1) (※) ・ foursquare foursquare はスマートフォンの GPS 機能を使った位置情報 SNS です。 [Nikkei-Trendy]   ・お店や駅など、自分がいる場所でチェックインすると、自分の場所がネット上に登録され、友人に公開されます。   ・ Tips といって自分の訪れたお店や施設について情報を書き込み、それを他の人が読むことができる機能があります。   ・他にも「品川駅に来たらこの店に行く」などとタスクを書いておくと、品川駅近辺でチェックインしたときにタスクを自動的に通知してくれる To-Do List 機能もあります。 ※ [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
  • 21. mongoDB はどんなところで使われているか (1-2) ・ foursquare ( 続き ) foursquare では、 25 台以上の Amazon EC2 サーバー上のシャーディングした mongoDB に、ユーザーの”チェックイン”情報を格納しています。また、お店や駅などの場所の情報に、 mongoDB の地理空間インデックスを使っています。 (※) ( 例 )  基本的なクエリ 与えられた位置情報に近いお店や施設を 20 個みつける場合 > db.venues.find({latlng: {$near: [40.72, -73.99]}).limit(20) ※ [Heymann] p8 現在地 …
  • 22. mongoDB はどんなところで使われているか (2) ・ Ameba Pico ( 仮想空間サービス「アメーバピグ」の海外版 )   Ameba Pico では、 AWS と以下の 技術を使用しています。 (※1 。図も ) - MongoDB - node.js - WebSocket - Flash Player ※ 1 [Namura] p.6, p.9 ※ 2 [AmebaPico] スクリーンショット (※2)
  • 23. mongoDB はどんなところで使われているか (3) (※) ・ intuit intuit では、小規模ビジネス用の web サイトにおいて、ユーザーの活動状況をリアルタイムに記録するのに mongoDB を使用しています。 mongoDB は、 craigslist, sourceforge, NY times, Springer, Taobao, サイバーエージェント等の有名な会社、組織で多数採用されています。 ※ [Mongo] Production Deployments (http://www.mongodb.org/display/DOCS/Production+Deployments)
  • 24. 参考文献 ・ [Mongo] MongoDB ホームページ (http://www.mongodb.org/) ・ [Chodorow&Dirolf] ”MongoDB: The Definitive Guide”, Kristina Chodorow & Michael Dirolf, 2010, O’reilly ・ [Banker] ”MongoDB in Action”, Kyle Banker, 2011, Manning MEAP Edition version 8 ・ [Inoue-1] ”MongoDB 全機能解説 (1)”, 井上 敬浩 , 2011, MongoDB 勉強会 第 3 回 資料 (http://www.slideshare.net/doryokujin/mongodb1) ・ [Namura] “MongoDB + node.js で作るソーシャルゲーム” , 名村 卓 , 2011, Mongo Tokyo 2011 資料 (http://www.slideshare.net/snamura/mongodb-nodejs) ・ [AmebaPico] “About Ameba Pico” (http://www.cyberagentamerica.com/games/) ・ [Wikipedia] Wikipedia 英語版 MongoDB (http://en.wikipedia.org/wiki/MongoDB) ・ [Nikkei-Trendy] “Twitter の次に来るのか、新世代ソーシャルサービス「 foursquare 」って何だろう?” , 日経トレンディネット , 2011/2/25 (http://trendy.nikkeibp.co.jp/article/pickup/20110223/1034598) ・ [Heymann] “Foursquare & MongoDB”, Harry Heymann, 2010 (https://docs.google.com/present/view?id=dhkkqm6q_13gm6jq5fv)