Mongodb

11,156 views

Published on

MongoDB 勉強会

Published in: Technology
0 Comments
13 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,156
On SlideShare
0
From Embeds
0
Number of Embeds
426
Actions
Shares
0
Downloads
129
Comments
0
Likes
13
Embeds 0
No embeds

No notes for slide
  • ss
  • Mongodb

    1. 1. MongoDB 10.7.07 株式会社あくしゅ 三上 悟
    2. 2. Agenda <ul><li>Introduction MongoDB </li></ul><ul><li>CRUD </li></ul><ul><li>Index </li></ul><ul><li>Geospatial </li></ul><ul><li>MongoMapper </li></ul>
    3. 3. MongoDB Stable 1.4.4 Devlopment 1.5.4 <ul><li>hu mongo uss(huge + monstrous)  超でかい </li></ul><ul><li>Document Database </li></ul><ul><li>C++ </li></ul><ul><li>Open Source </li></ul><ul><li>GNU AGPL v3.0 Licence </li></ul><ul><li>OSX,Linux,Windows,Solaris |32bit,64bit </li></ul><ul><li>Development and Support:10 gen </li></ul>
    4. 4. MongoDB vs CouchDB <ul><li>MongoDB </li></ul><ul><li>RDBMS,KeyValuc,DocumentDatabase のいいとこどりのデータベース </li></ul><ul><li>なんでもできる。 </li></ul><ul><li>REST ではなく、独自プロトコルを利用しているので早い </li></ul><ul><li>CouchDB </li></ul><ul><li>CouchDB も同じドキュメントデータベース </li></ul><ul><li>JSON 、 Map/Reduce, スキーマレス  N-Master Replication 似ている </li></ul><ul><li>CouchDB は用意している中で扱うには楽できるらしい。 Relax 。 </li></ul><ul><li>詳しくは知らない。 </li></ul>http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB
    5. 5. MongoDB In Production その他いっぱい 日本のサービスは掲載されていない。
    6. 6. Use Cases <ul><li>債券など非常に重要な取引では使わない。 </li></ul><ul><li>  RDBMS とのハイブリッド型にする </li></ul><ul><li>非常に高い更新が発生する問題に向いている。 </li></ul><ul><li>例えば </li></ul><ul><li>頻繁な更新されるウェブサイト </li></ul><ul><li>リアルタイム解析カウンタ </li></ul><ul><li>ソーシャルゲーム等 </li></ul>
    7. 7. Licence <ul><li>mongod と mongos は GNU AGPL v3.0 Licence </li></ul><ul><li>GPLv3 は組み込まれて、配布されるときに、著作権が適用される。 </li></ul><ul><li>今日、クラウドのようにネットワーク経由で利用する場合がほとんどのため、 </li></ul><ul><li>この抜け穴をつぶすために作られたライセンス。 </li></ul><ul><li>GPLv3 との違いはネットワーク経由で利用した場合でも適用される。 </li></ul><ul><li>データベースを改変したら、データベースのコードの公開が必要。 </li></ul><ul><li>ちゃんとコミュニティーに貢献してね。 </li></ul><ul><li>では自分のアプリケーションに組み込んだ場合はコードを公開する必要があるか? </li></ul><ul><li>Driver は Apache License v2.0 のため、自社のウェブアプリケーションに </li></ul><ul><li>組み込んで利用しても、アプリケーションのソースコードの公開義務はない。 </li></ul><ul><li>また社内で利用するアプリケーションの場合には、 </li></ul><ul><li>データベースに改変を加えてもソースコードの公開義務はない。 </li></ul>http://www.mongodb.org/display/DOCS/Licensing
    8. 8. System <ul><li>Document-oriented storage </li></ul><ul><li>Full Index Support </li></ul><ul><li>Replication & High Availability </li></ul><ul><li>Auto-Sharding </li></ul><ul><li>Querying </li></ul><ul><li>Fast In-Place Updates </li></ul><ul><li>Map/Reduce </li></ul><ul><li>GridFS </li></ul>
    9. 9. Collections <ul><li>RDB のテーブルにあたるもの </li></ul><ul><li>BSON Documents Group </li></ul>
    10. 10. Documents <ul><li>RDB のレコードにあたるもの </li></ul><ul><li>スキーマレス </li></ul><ul><li>Key/Value(BSON) </li></ul><ul><li>ユニークな ObjectID が付与 </li></ul>
    11. 11. Field <ul><li>RDB のカラムにあたるもの </li></ul><ul><li>KeyValueStore のキーにあたるもの </li></ul>
    12. 12. ObjectID <ul><li>BSON Object Data Type </li></ul><ul><li>Document ID: _id </li></ul><ul><li>Unique </li></ul><ul><li>Index Primary Key </li></ul><ul><li>16 進数文字列  ObjectId( &quot;47cc67093475061e3d95369d&quot; ) </li></ul>http://www.mongodb.org/display/DOCSJP/Object+ID
    13. 13. ObjectID <ul><li>ObjectID の仕様 12バイト </li></ul><ul><li>4byte timestamps   (big endian) </li></ul><ul><li>3byte machine </li></ul><ul><li>2byte process id </li></ul><ul><li>3byte counter   (big endian) </li></ul>0 1 2 3 4 5 6 7 8 9 10 11 time machine pid increment
    14. 14. BSON(Binaly JSON) <ul><li>Document に格納するデータ </li></ul><ul><li>JSON ベース </li></ul><ul><li>バイナリ </li></ul>
    15. 15. BSON DataType <ul><li>String </li></ul><ul><li>Integer </li></ul><ul><li>Double </li></ul><ul><li>Date </li></ul><ul><li>Byte array(binary data) </li></ul><ul><li>Boolean(true and false) </li></ul><ul><li>Null </li></ul><ul><li>BSON object </li></ul>
    16. 16. Start/Stop MongoDB #Start mongo daemon ./bin/mongod --dbpath /var/lib/mongodb/ --port 27017 & #Stop mongo daemon kill -2 PID OR kill -15 PID
    17. 17. MongoDB Shell ./bin/mongo MongoDB shell >use mydb
    18. 18. Before Start MongoDB ではあらかじめデータベースを作る必要はありません。 何かデータを作成すると、基本的なコレクションとデータベースを 作成します。存在しないコレクションに対してクエリーを発行すると、 MongoDB は空のコレクションとして返します。 use コマンドでデータベースを切り替えても、データベースはすぐには作成されません。データベースは、最初にデータが作成されたときに作成されます。 チュートリアルより http://www.mongodb.org/pages/viewpage.action?pageId=5079135
    19. 19. CRUD
    20. 20. CREATE <ul><li>SQL </li></ul><ul><li>INSERT INTO db.mycollections(name) VALUES(“mongo”); </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.mycollections.save({ name : “mongo”}); </li></ul>http://www.mongodb.org/display/DOCS/Inserting
    21. 21. READ <ul><li>SQL </li></ul><ul><li>SELECT * FROM mycolletions </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.mycollections.find(); </li></ul>
    22. 22. READ ORDER BY & LIMIT/OFFSET <ul><li>SQL </li></ul><ul><li>SELECT * FROM db.mycollections </li></ul><ul><li>WHERE name = “mongo” ORDER BY id DESC LIMIT 1,10; </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.mycollections.find({name:”mongo”}).sort({id: -1}).skip(1).limit(10); </li></ul>http://www.mongodb.org/display/DOCS/Querying
    23. 23. Conditional Operators <ul><li>$gt,$lt,$gte,$lte </li></ul><ul><li>$ne </li></ul><ul><li>$in </li></ul><ul><li>$nin </li></ul><ul><li>$mod </li></ul><ul><li>$all </li></ul><ul><li>$size </li></ul><ul><li>$exists </li></ul><ul><li>$type </li></ul><ul><li>$elemMatch </li></ul><ul><li>$not </li></ul><ul><li>$where </li></ul>http://www.mongodb.org/display/DOCS/Advanced+Queries
    24. 24. Conditional Operators WHERE key = value .find({key:value}) .find({key:{Operator:value}) WHERE key Condtion value SQL Conditions MongoDB Operators key > value key:{$gt:value} key < value key:{$lt:value} key >= value key:{$gte:value} key <= value key:{$lte:value} key <> value key:{$ne:value} key IN(value) key:{$in:[value]} key NOT IN(value) key:{$nin:[value]} key EXIST(value) key:{$exist:value} SQL Conditions MongoDB Oprators key = value key:value
    25. 25. SELECT between <ul><li>SQL </li></ul><ul><li>SELECT * FROM logs </li></ul><ul><li>where created_at BETWEEN ‘2010-06-10’ AND ‘2010-06-12’ </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.logs.find({ </li></ul><ul><li>created_at:{$gte:new Date(2010,6,10)}, </li></ul><ul><li>created_at:{$lte:new Date(2010,6,12)} </li></ul><ul><li>}); </li></ul><ul><li>もしくは </li></ul><ul><li>db.logs.find({ </li></ul><ul><li>$where:&quot;this.created_at >= new Date(2010,6,10) && this.created_at <= new Date(2010,6,12)&quot; </li></ul><ul><li>}) </li></ul>
    26. 26. READ COUNT <ul><li>SQL </li></ul><ul><li>SELECT COUNT(*) FROM users; </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.users.count(); </li></ul>
    27. 27. READ DISTINCT <ul><li>SQL </li></ul><ul><li>SELECT DISTINCT(name) FROM users; </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.users.distinct(“name”); </li></ul>
    28. 28. READ GROUP BY <ul><li>SQL </li></ul><ul><li>SELECT name,sum(marks) FROM users </li></ul><ul><li>WHERE name=“mikami” GROUP BY name; </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.users.group({ </li></ul><ul><li>key:{name:true}, </li></ul><ul><li>cond:{name:&quot;mikami&quot;}, </li></ul><ul><li>reduce: function(obj,prev){prev.msum += obj.marks}, </li></ul><ul><li>initial: {msum:0} </li></ul><ul><li>}); </li></ul><ul><li>組み込みの Map/Reduce を使う </li></ul>
    29. 29. UPDATE <ul><li>db.collection.update( Criteria, ObjNew, Upsert, Multi ) </li></ul><ul><li>Criteria </li></ul><ul><li>アップデートするレコードを選択するためのクエリー </li></ul><ul><li>ObjNew </li></ul><ul><li>対象のオブジェクトを、アップデートするオブジェクト、または $ オペレータ ($inc など ) </li></ul><ul><li>Upsert </li></ul><ul><li>レコードが存在しない場合にインサートするかどうか </li></ul><ul><li>Multi </li></ul><ul><li>criteria にマッチするオブジェクトすべてをアップデートするかどうか </li></ul><ul><li>( デフォルトでは最初に見つかったオブジェクトのみがアップデートされる ) </li></ul>http://www.mongodb.org/pages/viewpage.action?pageId=7209549
    30. 30. Modifier Operations <ul><li>$inc </li></ul><ul><li>$set </li></ul><ul><li>$unset </li></ul><ul><li>$push </li></ul><ul><li>$pushAll </li></ul><ul><li>$addToSet </li></ul><ul><li>$pop </li></ul><ul><li>$pull </li></ul><ul><li>$pullAll </li></ul>http://www.mongodb.org/display/DOCS/Updating
    31. 31. $inc インクリメント/デクリメント or シーケンシャルナンバー <ul><li>SQL </li></ul><ul><li>update entries set count= count+1 where _id = '4c2bf9d691951da31517df10’ </li></ul><ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bf9d691951da31517df10')}, </li></ul><ul><li>{$inc:{count:1}} </li></ul><ul><li>) </li></ul>
    32. 32. $set フィールド更新 <ul><li>SQL </li></ul><ul><li>update entries set name = ”ruby&quot; where user_id = 1 </li></ul><ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update({user_id:1},{$set:{name:”ruby“}}) </li></ul><ul><li>※ value には配列やオブジェクトも格納できるため、まるごと値が置き換わる </li></ul>
    33. 33. $unset フィールド削除 <ul><li>SQL </li></ul><ul><li>ALTER TABLE entries DROP COLUMN name; </li></ul><ul><li>※ すべて削除のみ </li></ul><ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bf9d691951da31517df10')}, </li></ul><ul><li>{$unset:{name:1}} </li></ul><ul><li>) </li></ul><ul><li>※ 特定のドキュメントのフィールドだけ消すことができる </li></ul>
    34. 34. $push <ul><li>SQL </li></ul><ul><li>ALTER TABLE entries ADD (body varchar(255)) </li></ul><ul><li>UPDATE entries SET tag=&quot;MongoDB&quot; where _id = 'c2bfaea91951da31517df12'’ </li></ul><ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfaea91951da31517df12')} </li></ul><ul><li>,{$push:{tag:&quot;MongoDB&quot;}} </li></ul><ul><li>) </li></ul><ul><li>tag に配列でプッシュされる。 </li></ul><ul><li>tag = ['MongoDB'] </li></ul><ul><li>2回目 </li></ul><ul><li>tag = ['MongoDB','MongoDB'] </li></ul>
    35. 35. $pushAll <ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfa4c91951da31517df11')}, </li></ul><ul><li>{$push:{tag:[&quot;Ruby&quot;,&quot;Rails&quot;,&quot;MongoDB&quot;]}} </li></ul><ul><li>) </li></ul><ul><li>まとめて格納できる。 </li></ul><ul><li>tag = [['Ruby','Rails','MongoDB']] </li></ul>
    36. 36. $addToSet <ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfaea91951da31517df12')}, </li></ul><ul><li>{$addToSet:{tag:”MongoDB&quot;}} </li></ul><ul><li>) </li></ul><ul><li>tag の配列にプッシュされる。値は重複しない </li></ul><ul><li>tag = ['MongoDB'] </li></ul><ul><li>2回目 </li></ul><ul><li>tag = [‘MongoDB’] </li></ul>
    37. 37. $pop <ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfaea91951da31517df12')}, </li></ul><ul><li>{$pop:{tag:1}} </li></ul><ul><li>) </li></ul><ul><li>{tag:1} の値は 1=pop -1=shift </li></ul>
    38. 38. $pull <ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfaea91951da31517df12')}, </li></ul><ul><li>{$pull:{tag:&quot;MongoDB&quot;}} </li></ul><ul><li>) </li></ul><ul><li>tag で指定した値にマッチする値をすべて削除 </li></ul>
    39. 39. $pullAll <ul><li>DynamicQuerys </li></ul><ul><li>db.entries.update( </li></ul><ul><li>{_id:ObjectId('4c2bfaea91951da31517df12')}, </li></ul><ul><li>{$pullAll:{tag:[&quot;MongoDB&quot;,&quot;Ruby&quot;]}} </li></ul><ul><li>) </li></ul><ul><li>tag で指定した配列の中に含まれる値にマッチする値をすべて削除 </li></ul>
    40. 40. DELETE <ul><li>SQL </li></ul><ul><li>DELETE FROM db.mycollections WHERE id = 12345678900 </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.mycollections.remove({_id: myobject._id}); </li></ul>http://www.mongodb.org/display/DOCS/Removing
    41. 41. DELETE <ul><li>SQL </li></ul><ul><li>DELETE FROM users WHERE age < 30 </li></ul><ul><li>Dynamic Querys </li></ul><ul><li>db.users.remove({age:{$lt:30}}); </li></ul>
    42. 42. Server Side Javascript <ul><li>JavascriptEngine(SpiderMonkey) </li></ul><ul><li>v8 は開発中 </li></ul><ul><li>ストアドプロシージャー </li></ul><ul><li>いままで解説した関数は Javascript で定義されている </li></ul><ul><li>()を外すと、中の実装が見れる。 </li></ul><ul><li>>db.test.find </li></ul><ul><li>function (query, fields, limit, skip) { </li></ul><ul><li>return new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip); </li></ul><ul><li>} </li></ul><ul><li>中身のコード </li></ul><ul><li>http://github.com/mongodb/mongo/tree/master/shell/ </li></ul>
    43. 43. Server Side Javascript <ul><li>新しく定義することもできる。 </li></ul><ul><li>>db.system.js.save({_id: &quot;sum&quot;, value: function (x, y) { return x + y; }}); </li></ul><ul><li>>db.eval(&quot;return sum(2, 3);&quot;); </li></ul><ul><li>5 </li></ul><ul><li>直接スクリプトを実行することも可能 </li></ul><ul><li>./bin/mongo example.js </li></ul><ul><li>最近、海外で流行っている node.js との相性がいい </li></ul><ul><li>Node.js </li></ul><ul><li>v8 エンジンを組み込んだイベントドリブンな Web サーバー </li></ul>
    44. 44. Index
    45. 45. Index <ul><li>RDB </li></ul><ul><li>CREATE INDEX name ON mycollections(name); </li></ul><ul><li>MongoDB </li></ul><ul><li>db.mycollections.ensureIndex({name: 1 }); #ASC </li></ul><ul><li>db.mycollections.ensureIndex({name: -1 }); #DESC </li></ul>http://www.mongodb.org/pages/viewpage.action?pageId=5800049
    46. 46. Index <ul><li>B-Tree </li></ul><ul><li>指定されたキーで高速に検索が可能 </li></ul><ul><li>_id は常にインデックスが生成される </li></ul><ul><li>すべてのフィールドにインデックスを生成できる </li></ul><ul><li>フィールドに配列が保存された場合、 </li></ul><ul><li>   それぞれの要素にインデックスを作成する。 </li></ul>
    47. 47. Multi Key Index <ul><li>db.things.ensureIndex({j:1, name:-1}); </li></ul>
    48. 48. Unique Index <ul><li>db.things.ensureIndex( </li></ul><ul><li>{firstname: 1, lastname: 1}, </li></ul><ul><li>{unique: true} </li></ul><ul><li>); </li></ul>
    49. 49. Geospatial
    50. 50. Geospatial <ul><li>地理空間を扱うための、 </li></ul><ul><li>インデックス、クエリーがサポートされている。 </li></ul><ul><li>Index </li></ul><ul><li>db.map.ensureIndex({location: “2d”}) </li></ul><ul><li>Query </li></ul><ul><li>$near 現在地から近い位置情報を検索 </li></ul><ul><li>$box 長方形の範囲内の位置情報を検索 </li></ul><ul><li>$center  中心から半径の距離に含まれる位置情報を検索 </li></ul>
    51. 51. Geospatial <ul><li>まだ開発途中 </li></ul><ul><li>Development 1.5.4 ( 2010/07/02 Releasae) で $box,$circle の バグが解消された。 </li></ul><ul><li>地球は丸いのに、平面で計算しているため、 </li></ul><ul><li>正確な位置情報を取得できない。 </li></ul><ul><li>Foursqure の中の人いわく、 </li></ul><ul><li>近い距離 (1degree=110km) 以内なら問題ない。 </li></ul><ul><li>Foursquare & MongoDB(http://bit.ly/cOsWa8) </li></ul><ul><li> ( Javascript で計算すれば可能。 パフォーマンスは未調査) </li></ul>
    52. 52. Index <ul><li>RDB(MySQL) </li></ul><ul><li>INSERT INTO map(`latlng`) </li></ul><ul><li>VALUES(GeoFromText(POINT(35.68238, 139.7665)); </li></ul><ul><li>CREATE SPATIAL INDEX latlng ON map(latlng); </li></ul><ul><li>MongoDB </li></ul><ul><li>db.map.insert(location: </li></ul><ul><li>{lat:35.68238}, </li></ul><ul><li>{lng:139.7665} </li></ul><ul><li>); </li></ul><ul><li>db.map.ensureIndex({location: “2d”}) </li></ul>
    53. 53. $near <ul><li>>db.places.find( </li></ul><ul><ul><li>{ loc : { $near : [35,139] , 1 } </li></ul></ul><ul><ul><li>}).limit(10) </li></ul></ul><ul><li>1 degree 以内の位置を取得する。 </li></ul>
    54. 54. $center <ul><li>> center = [50, 50] </li></ul><ul><li>> radius = 10 </li></ul><ul><li>> db.places.find( </li></ul><ul><li>{&quot;loc&quot; : </li></ul><ul><li> {&quot;$within&quot; : {&quot;$center&quot; : [center, radius]}} </li></ul><ul><li>} </li></ul><ul><li>) </li></ul>
    55. 55. $box <ul><li>>box = [[40, 40], [60, 60]] </li></ul><ul><li>>db.places.find({&quot;loc&quot; : </li></ul><ul><li>{&quot;$within&quot; : {&quot;$box&quot; : box}} </li></ul><ul><li>} </li></ul><ul><li>) </li></ul>
    56. 56. See also <ul><li>Document </li></ul><ul><li>http://www.mongodb.org/display/DOCS/Developer+Zone </li></ul><ul><li>Cookbook </li></ul><ul><li>http://cookbook.mongodb.org/index.html </li></ul><ul><li>Video & Slides </li></ul><ul><li>http://www.mongodb.org/display/DOCS/Events </li></ul><ul><li>Articles </li></ul><ul><li> http://www.mongodb.org/display/DOCS/Articles </li></ul>
    57. 57. See also <ul><li>Slides </li></ul><ul><li>http://www.slideshare.net/fuchaoqun/mongodb-in-action-2976022 </li></ul>
    58. 58. MongoMapper http://github.com/jnunemaker/mongomapper
    59. 59. MongoMapper Stable 0.8.2 <ul><li>MongoDB を ActiveRecord を扱うように </li></ul><ul><li> 操作できる ruby のデータベースラッパー </li></ul>
    60. 60. MongoMapper vs Mongoid <ul><li>Good </li></ul><ul><li>Support Rails2.3 is good </li></ul><ul><li>Plugin system </li></ul><ul><li>ActiveRecord </li></ul><ul><li>Building code ( http://github.com/patcito/shapado ) </li></ul><ul><li>Bad </li></ul><ul><li>・ Master/Slave replication Clusters does not support. </li></ul><ul><li>See also: http://bit.ly/9diwYp </li></ul>
    61. 61. MongoMapper <ul><li>ActiveRecord </li></ul><ul><li>class Person < ActiveRecord::Base </li></ul><ul><li>end </li></ul><ul><li>MongoMapper </li></ul><ul><li>class Person </li></ul><ul><li>Include MongoMapper::Document </li></ul><ul><li>end </li></ul>
    62. 62. gems <ul><li>gem install mongo_mapper </li></ul><ul><li>#the c extensions (for production) </li></ul><ul><li>gem install mongo_ext </li></ul>
    63. 63. Setup <ul><li>config/enviroment.rb </li></ul><ul><li>config.gem 'mongo' </li></ul><ul><li>config.gem 'mongo_mapper' </li></ul><ul><li>#remove ActiveRecord </li></ul><ul><li>  config.frameworks -= [ :active_record, :active_resource ] </li></ul>
    64. 64. Schema Design <ul><li>class Person include MongoMapper::Document </li></ul><ul><li>include MongoMapper::Document </li></ul><ul><li>key :first_name, String, :required => true </li></ul><ul><li>key :last_name, String , :required => true </li></ul><ul><li>key :age, Integer , :numeric => true </li></ul><ul><li>key :born_at, Time </li></ul><ul><li>key :active, Boolean </li></ul><ul><li>key :fav_colors, Array </li></ul><ul><li>validates_presence_of :first_name </li></ul><ul><li>validates_presence_of :last_name </li></ul><ul><li>validates_numericality_of :age </li></ul><ul><li>End </li></ul>
    65. 65. Query <ul><li>Dynamic Querys </li></ul><ul><li>db.collections.find(name:”mikami”); </li></ul><ul><li>Mongo Mapper </li></ul><ul><li>self.query.where(:name => “mikami”).find </li></ul>
    66. 66. See also <ul><li>http://blog.bitzesty.com/mongodb-with-mongomapper-and-ruby-on-rails </li></ul>
    67. 67. Contact <ul><li>@saicologic(Twitter Follow me!) </li></ul><ul><li>http://d.hatena.ne.jp/saicologic/ </li></ul><ul><li>[email_address] </li></ul>

    ×