JavaScript屋さんにとってはMongoDBはこの上ないアレなんだと思いますが、 自分にはちょっと壁が高いかもしれないので(いつになったらモノにすんだって話はおいといてw)、 使い慣れたSpringから叩いてみることにしました。 ちなみに、日本にいた頃に開発に携わってたシステムでは、 WebはSpringMVCでCloudFoundryに乗っけて、BatchはSpringBatchで作って、みたいのを考えてて、 ゆくゆくはでっかいデータをMongoDBに入れてサクっとごっついレポート機能作ったりしたいなぁ なんて考えていました。 ■ SpringSource Tool Suiteのインストール ということでSpring動かすためにSTSをダウンロードしてきます。 #以前からいくつかSpringまわりのエントリを書いてますが、 #家のMacBookだったり、会社のデスクトップだったり、会社のノートPCだったり、 #会社のノートPCをXPからWin7に入れ替えたりとか、何かと毎回インストールしてますww Eclipse3.7.1ベースの2.8ってバージョンがカレントバージョンだそうで、 ↓をインストールして次へ次へする感じです。 springsource-tool-suite-2.8.0.RELEASE-e3.7.1-win32-installer.exe デフォルトだとProgram Filesの中に入ります。 このMaven前提みたいのが、めんどくさがりやの自分的にはありがたいです。 Rooはまだ手出す予定ないのですが、とりあえず…w とかやってたら、JDKすら入ってなかったので jdk-7u1-windows-i586.exe を落としてきます… #なんかOracle,Oracleしてて若干ひくわーっていう。。 いよいよ起動してみると、メモリ2GBのWindowsノートPCだとちょっとつらいかな的な予感… ■ サンプルプロジェクトをみてみる とりあえずサンプルプロジェクトをチェックしてみることにしました。 Spring系のソースはGithubに乗ってるので楽にチェック出来てナイスです。 spring-data-document-examples(https://github.com/SpringSource/spring-data-document-examples) なんかCouchDBってのがあるなぁってのはおいておいて、とりあえずmongodb-helloから見てみます。 pom.xmlを眺めてみると、cglibっていうバイトコードをアレするようの ライブラリの他はLog系とSpring系しかありません。
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency>
Javaが置いてあるメインなディレクトリを除いてみると、 Main文を持ってるApp.javaと MongoDBがあるサーバを指定してるのとException用の定義が書いてあるAppConfig.javaと MongoDBを叩いてホゲホゲするHelloMongo.javaが置いてあります。 HelloMongo.javaの中身は↓がメインなところで、PersonとAccountという バリューオブジェクトを使いつつMongoDBとやりとります。 #JavaのバリューオブジェクトとMongoDBのコレクションが紐づく感じで。 ちなみにPersonとAccountはdomainディレクトリに置いてあります。ドメインオブジェクトっていうのが正しいのかなぁ~
// MongoDBにコレクションを作ります mongoOperations.createCollection(Person.class); // バリューオブジェクトに値をつめます Person p = new Person("John", 39); Account a = new Account("1234-59873-893-1", Account.Type.SAVINGS, 123.45D); // PersonオブジェクトはAccountのListなプロパティを持っていてそこにaddします p.getAccounts().add(a); // PersonオブジェクトをMongoDBにインサートします mongoOperations.insert(p); // インサートしたPersonを取得して標準出力に表示します List results = mongoOperations.findAll(Person.class); System.out.println("Results: " + results);
まぁ、なんとお手軽な…。 ■ サンプルプロジェクトを動かしてみる ソース読んだだけじゃあれだしって事で、このサンプルプロジェクトを ダウンロードして、さっきインストールしたSTSに突っ込んで、 ローカルのMongoDBに対してアクセスしてみます。 STSのworkspaceにダウンロードしてきたmongodb-helloプロジェクトを置きます。 インポートしようとしたら、プロジェクトとして認識されなかったので、 Springプロジェクトを新しく作って名前をmongo-helloにすることでインポートっぽく。 プロジェクトを右クリックして、Spring Tools→Update Maven Dependenciesで、 pom.xmlに書かれた依存ライブラリをダウンロードしてくれます。 コンソール眺めてるとMongoDBのJava用ドライバーとか落としてきてますね。
http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/2.6.5/mongo-java-driver-2.6.5.pom Downloaded: http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/2.6.5/mongo-java-driver-2.6.5.pom
これにて一件落着かと思ったら、なんかエラー出てるし…orz aspectjrt.jarってのが無いらしいですよ、と。 ↓なんか書いてあるけど、コレ系でしょうか…
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.7</version> <!-- Note 2.8 does not work with AspectJ aspect path -->
ググってみると↓とか言ってる人がいて、、なんだよーーっていう。。 http://blog.springsource.com/2011/03/25/early-access-springsource-tool-suite-for-eclipse-indigo-3-7/
I got the Eclipse one working, it was a new download and Maven wasn't part of it, so as soon as I installed the m2 plugin I got it working. Thanks for your help. I have given up on the STS
まぁ、よくわからないけど、Jarファイルがありゃいいんでしょってことで↓を突っ込んでやりました、と。 ちなみに1.5.4(http://mvnrepository.com/artifact/aspectj/aspectjrt/1.5.4)をみてみたら0バイトって…
<dependency> <groupId>aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.5.3</version> </dependency>
そしていよいよ緊張の一瞬です、、と。。 動きました。めでたしめでたし。
Bootstrapping HelloMongo 2011-11-06 13:56:20,857 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - 2011-11-06 13:56:20,979 INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - 2011-11-06 13:56:22,439 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - 2011-11-06 13:56:22,498 INFO [org.springframework.context.support.ClassPathXmlApplicationContext] - 2011-11-06 13:56:22,506 INFO [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Results: [Person [id=4eb6f47865c17a6a351f28e8, name=John, age=39, accounts=[Account [id=null, accountNumber=1234-59873-893-1, accountType=SAVINGS, balance=123.45]]]] DONE!
MongoDBサーバのログみると、以下のようにtestデータベースにpersonコレクションを作って インサート処理が走ってるのが分かります。
Sun Nov 06 13:56:23 [initandlisten] connection accepted from 192.168.1.5:58293 #2 Sun Nov 06 13:56:24 [conn2] build index test.person { _id: 1 } Sun Nov 06 13:56:24 [conn2] build index done 0 records 0.048 secs Sun Nov 06 13:56:24 [conn2] command test.$cmd command: { create: "person" } ntor eturn:1 reslen:37 109ms Sun Nov 06 13:56:24 [conn2] end connection 192.168.1.5:58293 Sun Nov 06 13:56:41 [clientcursormon] mem (MB) res:4 virt:95 mapped:32
MongoDBクライアントから叩いてみると、 見易くすると↓こんな感じなんですが、SpringData使ってMongoDBごにょごにょ | するめとめがねの方もおっしゃってますが、 _classっちゅうのはなんか領域な無駄な気がしてならないっていうか。。
{ "_id" : ObjectId("4eb6f47865c17a6a351f28e8"), "_class" : "org.springframework.data.mongodb.examples.hello.domain.Person", "name" : "John", "age" : 39, "accounts" : [{"accountNumber" : "1234-59873-893-1", "accountType" : "SAVINGS", "balance" : 123.45 }] }