JavaでMongoDB船戸 隆
2011/02/25
2011年2月28日月曜日
アジェンダ
2011年2月28日月曜日
MongoDBの特徴
データ構造
MongoDBを操るには?
接続
操作
アジェンダ
2011年2月28日月曜日
MongoDBの特徴
2011年2月28日月曜日
MongoDBの特徴MongoDBはドキュメント指向データベース
データの格納方法がオブジェクト指向的
基本JSONの形(BSON)
マッピングのコストが低い
JOINの必要がない。というかできない。
2011年2月28日月曜日
ドキュメント指向データベースとは?
2011年2月28日月曜日
RDBではそれぞれのテーブルの関係をリレーションで表すSQLを使うOneToManyの表現がしずらい1+N問題オブジェクト指向言語と相性がよくない
2011年2月28日月曜日
ドキュメント指向DBでは
レコードの単位がドキュメントJOINしない。内包する。事前に構造を決める必要がない(スキーマレス)オブジェクト指向的構造にマッチしやすい
2011年2月28日月曜日
MongoDBの特徴高性能
読み書きが高速
高可用性(マスタ、スレイブ自動切り替え)
容易なスケーラビリティ(シャーディング)
高機能なクエリ
2011年2月28日月曜日
MongoDBの特徴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.findOne(); 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.find(); while (cursor.hasNext()) { col.remove(cursor.next()); }
2011年2月28日月曜日
検索演算子
様々な演算子
検索条件もDBObject
<, <=, >, >=$all$exists$mod$ne$in$nin$nor$or$size$type
正規表現...
new BasicDBObject("$all", 値)
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.find(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.find(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.find(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.find(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.find(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日月曜日
Recommended