狠狠撸

狠狠撸Share a Scribd company logo
闯补惫补で惭辞苍驳辞顿叠
                    船戸?隆


                       2011/02/25



2011年2月28日月曜日
アジェンダ




2011年2月28日月曜日
アジェンダ
                惭辞苍驳辞顿叠の特徴

                  データ構造

                MongoDBを操るには?

                  接続

                  操作

2011年2月28日月曜日
惭辞苍驳辞顿叠の特徴




2011年2月28日月曜日
惭辞苍驳辞顿叠の特徴
                MongoDBはドキュメント指向データベース

                  データの格納方法がオブジェクト指向的

                  基本JSONの形(BSON)

                  マッピングのコストが低い

                  JOINの必要がない。というかできない。


2011年2月28日月曜日
ドキュメント指向
                データベースとは?



2011年2月28日月曜日
搁顿叠では
                それぞれのテーブルの関係を
                リレーションで表す
                SQLを使う
                OneToManyの表現がしずらい
                1+N問題
                オブジェクト指向言語と相性
                がよくない



2011年2月28日月曜日
ドキュメント
         指向DBでは
                レコードの単位がドキュメント
                JOINしない。内包する。
                事前に構造を決める必要がない
                (スキーマレス)
                オブジェクト指向的構造にマッ
                チしやすい




2011年2月28日月曜日
惭辞苍驳辞顿叠の特徴
                高性能

                 読み書きが高速

                 高可用性(マスタ、スレイブ自動切り替え)

                 容易なスケーラビリティ(シャーディング)

                 高機能なクエリ


2011年2月28日月曜日
惭辞苍驳辞顿叠の特徴
                C++で書かれてる

                   Boost使ってる

                GridFS

                   分散ファイルシステム

                Map/Reduce

                商用サポート       http://www.10gen.com/support




2011年2月28日月曜日
用?語

2011年2月28日月曜日
RDB   MongoDB

                レコード   ドキュメント


                カラム    エレメント


                テーブル   コレクション



2011年2月28日月曜日
実際に操作


2011年2月28日月曜日
どのようにアクセスするか?
                Javaの場合java-driverを使用してアクセス
                する。もちろんJavaで書かれている。

                  Maven2のリポジトリに登録されている

                その他にもC、C#、C++、.NET、
                ColdFusion、Erlang、PHP、Javascript
                など

2011年2月28日月曜日
接続方法

                    接続サンプル

                        JDBCの接続文字列のような感じ

                
   
   MongoURI uri = new MongoURI("mongodb://192.168.128.3 ");
                
   
   Mongo mongo = new Mongo(uri);
                
   
   DB db = mongo.getDB("sengoku");



                                    DBが存在しない場合は自動で作成される




2011年2月28日月曜日
コレクションを取得
                    DBを取得して、さらにコレクションを取得

                        RDBで言うところのテーブルを取得

                        コレクションに対して操作を行う

                
   
   DB db = getDB();
                
   
   // コレクションがなければコレクションを新規作成
                
   
   DBCollection collection = db.getCollection("daimyou");




2011年2月28日月曜日
コレクションに対する操作

                追加

                更新

                削除

                検索


2011年2月28日月曜日
追加
                DBObjectに対して値を追加

                        Mapのような感じ

                        どんどん入れ子にできる
                
   
   DBObject dbObject = new BasicDBObject();
                
   
   dbObject.put("name", “あいうえお”);
                
   
   dbObject.put("sex", "male");
                
   
   dbObject.put("age", 35);
                
   
   dbObject.put("height", 170);
                
   
   dbObject.put("weight", 61);
                
   
   dbObject.put("list", new ArrayList<String>());
                
   
   dbObject.put("list", new HashMap<String, String>());




2011年2月28日月曜日
追加
                    コレクションに追加

                        あとはよろしくやってくれる

                        MongoDBが内部使うユニークなキー(UUID)を
                        自動で振ってくれる
                
   
   DBCollection collection = db.getCollection("daimyou");
                    
   collection.insert(dbObject);




2011年2月28日月曜日
更新
                    クエリを使って更新をかける


                
   
   DBCollection col = db.getCollection("daimyou");
                
   
   DBObject dbobject = col.?ndOne();
                
   
   String name = (String)dbobject.get("name");
                
   
   System.out.println(dbobject);
                
   
   System.out.println(name);
                
   
   dbobject.put("name", "あいうえお");
                
   
   DBObject query = BasicDBObjectBuilder.start()
                            .add("_id", dbobject.get("_id")).get();
                
   
   WriteResult update = col.update(query, dbobject);




2011年2月28日月曜日
削除
                    取得したドキュメントを渡して削除



                
   
   DB db = getDB();
                
   
   DBCollection col = db.getCollection("daimyou");
                
   
   // 全件取得
                
   
   DBCursor cursor = col.?nd();
                
   
   while (cursor.hasNext()) {
                
   
   
  col.remove(cursor.next());
                
   
   }




2011年2月28日月曜日
検索
                                               <, <=, >, >=
                                               $all
                                               $exists
                 演算子
                                               $mod
                                               $ne
                     様々な演算子                    $in
                                               $nin
                                               $nor
                 検索条件もDBObject
                                               $or
                new BasicDBObject("$all", 値)   $size
                                               $type
                                               正規表現
                                                      ...


2011年2月28日月曜日
検索
                    or条件

                
   
   // 条件付き取得
                
   
   // or 条件
                
   
   // territory = 美濃国 or territory = 飛騨国
                
   
   BasicDBObject query = new BasicDBObject();
                
   
   query.put("territory", "美濃国");
                
   
   query.put("territory", "飛騨国");
                
   
   System.out.println(query);

                
   
   DBCursor cursor = col.?nd(query);
                
   
   while (cursor.hasNext()) {
                
   
   
  System.out.println(cursor.next());
                
   
   }




2011年2月28日月曜日
検索
                大小



                 
   
   // age > 45
                 
   
   query = new BasicDBObject();
                 
   
   query.put("age", new BasicDBObject("$gt", 45));
                 
   
   System.out.println(query);
                 
   
   cursor = col.?nd(query);
                 
   
   while (cursor.hasNext()) {
                 
   
   
   System.out.println(cursor.next());
                 
   
   }




2011年2月28日月曜日
検索
                IN条件

                
   
   // weight in (40, 50, 60)
                
   
   query = new BasicDBObject();
                
   
   query.put("weight", new BasicDBObject("$in",
                
   
   
   
   new Integer[] { 40, 50, 60 }));
                
   
   System.out.println(query);
                
   
   cursor = col.?nd(query);
                
   
   while (cursor.hasNext()) {
                
   
   
   System.out.println(cursor.next());
                
   
   }




2011年2月28日月曜日
検索
                    配列のマッチ


        
   
   // 配列のマッチ。三河国、美濃国、出雲国をすべて要素にもつもの。
        
   
   query = new BasicDBObject();
        
   
   query.put("territory", new BasicDBObject("$all", new String[] { "三河国",
        
   
   
   
   "美濃国", "出雲国" }));
        
   
   System.out.println(query);
        
   
   cursor = col.?nd(query);
        
   
   while (cursor.hasNext()) {
        
   
   
   System.out.println(cursor.next());
        
   
   }




2011年2月28日月曜日
検索
                    要素の数



                
   
   // territoryの要素の数が3つのもの
                
   
   query = new BasicDBObject();
                
   
   query.put("territory", new BasicDBObject("$size", 3));
                
   
   System.out.println(query);
                
   
   cursor = col.?nd(query);
                
   
   while (cursor.hasNext()) {
                
   
   
   System.out.println(cursor.next());
                
   
   }




2011年2月28日月曜日
検索
                DISTINCT



                
   
   // 名前でdistinct
                
   
   List distinct = col.distinct("name");
                
   
   for (Object obj : distinct) {
                
   
   
    System.out.println(obj);
                
   
   }




2011年2月28日月曜日
検索
                その他

                 オフセット検索

                 Count

                 Sort

                 グルーピング

                 Map/Reduce



2011年2月28日月曜日
最后に
                OR/Mappingフレームワーク

                  Morphia

                今のところ銀の弾丸に近いところまで

                RDB置き換わる可能性



2011年2月28日月曜日
ありがとうございました




2011年2月28日月曜日

More Related Content

Javaでmongo db

  • 1. 闯补惫补で惭辞苍驳辞顿叠 船戸?隆 2011/02/25 2011年2月28日月曜日
  • 3. アジェンダ 惭辞苍驳辞顿叠の特徴 データ構造 MongoDBを操るには? 接続 操作 2011年2月28日月曜日
  • 5. 惭辞苍驳辞顿叠の特徴 MongoDBはドキュメント指向データベース データの格納方法がオブジェクト指向的 基本JSONの形(BSON) マッピングのコストが低い JOINの必要がない。というかできない。 2011年2月28日月曜日
  • 6. ドキュメント指向 データベースとは? 2011年2月28日月曜日
  • 7. 搁顿叠では それぞれのテーブルの関係を リレーションで表す SQLを使う OneToManyの表現がしずらい 1+N問題 オブジェクト指向言語と相性 がよくない 2011年2月28日月曜日
  • 8. ドキュメント 指向DBでは レコードの単位がドキュメント JOINしない。内包する。 事前に構造を決める必要がない (スキーマレス) オブジェクト指向的構造にマッ チしやすい 2011年2月28日月曜日
  • 9. 惭辞苍驳辞顿叠の特徴 高性能 読み書きが高速 高可用性(マスタ、スレイブ自動切り替え) 容易なスケーラビリティ(シャーディング) 高機能なクエリ 2011年2月28日月曜日
  • 10. 惭辞苍驳辞顿叠の特徴 C++で書かれてる Boost使ってる GridFS 分散ファイルシステム Map/Reduce 商用サポート http://www.10gen.com/support 2011年2月28日月曜日
  • 12. RDB MongoDB レコード ドキュメント カラム エレメント テーブル コレクション 2011年2月28日月曜日
  • 14. どのようにアクセスするか? Javaの場合java-driverを使用してアクセス する。もちろんJavaで書かれている。 Maven2のリポジトリに登録されている その他にもC、C#、C++、.NET、 ColdFusion、Erlang、PHP、Javascript など 2011年2月28日月曜日
  • 15. 接続方法 接続サンプル JDBCの接続文字列のような感じ MongoURI uri = new MongoURI("mongodb://192.168.128.3 "); Mongo mongo = new Mongo(uri); DB db = mongo.getDB("sengoku"); DBが存在しない場合は自動で作成される 2011年2月28日月曜日
  • 16. コレクションを取得 DBを取得して、さらにコレクションを取得 RDBで言うところのテーブルを取得 コレクションに対して操作を行う DB db = getDB(); // コレクションがなければコレクションを新規作成 DBCollection collection = db.getCollection("daimyou"); 2011年2月28日月曜日
  • 17. コレクションに対する操作 追加 更新 削除 検索 2011年2月28日月曜日
  • 18. 追加 DBObjectに対して値を追加 Mapのような感じ どんどん入れ子にできる DBObject dbObject = new BasicDBObject(); dbObject.put("name", “あいうえお”); dbObject.put("sex", "male"); dbObject.put("age", 35); dbObject.put("height", 170); dbObject.put("weight", 61); dbObject.put("list", new ArrayList<String>()); dbObject.put("list", new HashMap<String, String>()); 2011年2月28日月曜日
  • 19. 追加 コレクションに追加 あとはよろしくやってくれる MongoDBが内部使うユニークなキー(UUID)を 自動で振ってくれる DBCollection collection = db.getCollection("daimyou"); collection.insert(dbObject); 2011年2月28日月曜日
  • 20. 更新 クエリを使って更新をかける DBCollection col = db.getCollection("daimyou"); DBObject dbobject = col.?ndOne(); String name = (String)dbobject.get("name"); System.out.println(dbobject); System.out.println(name); dbobject.put("name", "あいうえお"); DBObject query = BasicDBObjectBuilder.start() .add("_id", dbobject.get("_id")).get(); WriteResult update = col.update(query, dbobject); 2011年2月28日月曜日
  • 21. 削除 取得したドキュメントを渡して削除 DB db = getDB(); DBCollection col = db.getCollection("daimyou"); // 全件取得 DBCursor cursor = col.?nd(); while (cursor.hasNext()) { col.remove(cursor.next()); } 2011年2月28日月曜日
  • 22. 検索 <, <=, >, >= $all $exists 演算子 $mod $ne 様々な演算子 $in $nin $nor 検索条件もDBObject $or new BasicDBObject("$all", 値) $size $type 正規表現 ... 2011年2月28日月曜日
  • 23. 検索 or条件 // 条件付き取得 // or 条件 // territory = 美濃国 or territory = 飛騨国 BasicDBObject query = new BasicDBObject(); query.put("territory", "美濃国"); query.put("territory", "飛騨国"); System.out.println(query); DBCursor cursor = col.?nd(query); while (cursor.hasNext()) { System.out.println(cursor.next()); } 2011年2月28日月曜日
  • 24. 検索 大小 // age > 45 query = new BasicDBObject(); query.put("age", new BasicDBObject("$gt", 45)); System.out.println(query); cursor = col.?nd(query); while (cursor.hasNext()) { System.out.println(cursor.next()); } 2011年2月28日月曜日
  • 25. 検索 IN条件 // weight in (40, 50, 60) query = new BasicDBObject(); query.put("weight", new BasicDBObject("$in", new Integer[] { 40, 50, 60 })); System.out.println(query); cursor = col.?nd(query); while (cursor.hasNext()) { System.out.println(cursor.next()); } 2011年2月28日月曜日
  • 26. 検索 配列のマッチ // 配列のマッチ。三河国、美濃国、出雲国をすべて要素にもつもの。 query = new BasicDBObject(); query.put("territory", new BasicDBObject("$all", new String[] { "三河国", "美濃国", "出雲国" })); System.out.println(query); cursor = col.?nd(query); while (cursor.hasNext()) { System.out.println(cursor.next()); } 2011年2月28日月曜日
  • 27. 検索 要素の数 // territoryの要素の数が3つのもの query = new BasicDBObject(); query.put("territory", new BasicDBObject("$size", 3)); System.out.println(query); cursor = col.?nd(query); while (cursor.hasNext()) { System.out.println(cursor.next()); } 2011年2月28日月曜日
  • 28. 検索 DISTINCT // 名前でdistinct List distinct = col.distinct("name"); for (Object obj : distinct) { System.out.println(obj); } 2011年2月28日月曜日
  • 29. 検索 その他 オフセット検索 Count Sort グルーピング Map/Reduce 2011年2月28日月曜日
  • 30. 最后に OR/Mappingフレームワーク Morphia 今のところ銀の弾丸に近いところまで RDB置き換わる可能性 2011年2月28日月曜日