2015の8日目の記事です。はじめに昨日の記事でGroovyからMongoDBを扱う基本を示しました。今回は、さらにGroovyの機能を使ってよりGroovyな感じを掴んでみましょう!なお、一番最後にコード全体を記載していますので、時間のない方はそちらを見て頂いてもOKです。ドキュメントの生成をよりシンプルにさて、昨日の記事でドキュメントを生成する際に、以下のコードを書きました。102))collection.insertOne(doc)その結果生成されるドキュメント(JSON)は以下のようになります。}}いいねー!シンプルシンプル!でも、よく見ると毎回フィールドごとにappend書かなきゃイケないのが冗長ですね。入れ子の場合にはまたDocumentオブジェクト生成しないといけないし。はい!あります!対応策あります!と言ってもそんな難しい話ではなくて、実はDocumentクラスはコンストラクタでMapを受け付けてくれます。!Groovyの場合はMapがとてもお手軽に生成できます。Document(doc2))これです!これだけです!このコードは最初のappendだらけのコードと全く同じです!新しいMongoDBの公式JavaDriverと、Groovyの機能を組み合わせるとこんなにコードがシンプルになります!JSON(テキスト)を保存するGroovyのGStringを使えば、簡単にJSONをテキストとして表現できます。GStringを利用するのには別に特別は宣言などは必要ありません。3つのダブルクォーテーションで囲んであげれば、改行やエスケープが簡単に記述できます。Documentクラスはスタティックメソッドとしてテキスト形式のJSONをパースするparseメソッドがあるので、JSONテキストを渡してあげれまこれまたお手軽にMongoDBに保存できます。"MongoDB"]}"""collection.insertOne(Document.parse(jsonAsText))通常のJSONをテキスト(String)として変数jsonAsTextに格納して、Document.parse()に渡しているだけです。これで、Mapを使ったDocumentインスタンスの生成と同じことが実現できています。JSON(オブジェクト)を保存するさて、コレは一体なんのことでしょう?基本的に上記のテキストでJSONを表現する方法で、Stringの中で変数も扱えるので特に問題はないのですが、GroovyにはJsonBuilderという簡単にJSONオブジェクトを生成するクラスがあります。今度はこのJsonBuilderを使って同じことをしてみましょう。Groovy上で、複雑なJSONを生成する場合、JsonBuilderがとっても便利。'MongoDB'}collection.insertOne(Document.parse(builder.toPrettyString()))実行結果は上記の「JSON(テキスト)を保存する」と全く同じです。JsonBuilderのインスタンスを生成して値をその中に記述していくだけです。VALUE"の形式ですが、上記のJsonBuilderの書き方だとキーとバリューの間のコロンが必要なくなります。(が、addressの部分のようにそうでもない例外もあります。)そしてDocument.parseにtoStringした値を渡すだけでOKです。ちなみに、JsonBuilderにはbuilder.toPrettyStringというメソッドが用意されていて、buiderの値を綺麗に表示することが出来ます。]}JSON(テキスト)を編集して保存するさて、最初の「JSON(テキスト)を保存する」の応用編です。String型変数jsonAsTextにJSONが格納されています。この状態で値を変更するにはどうすればいいでしょうか?テキストなので当然正規表現で置換することも出来ます。そんな面倒臭いことしなく無いですよね?Groovyならそれを簡単に実現できます!GroovyにはテキストのJSONをMapライクなオブジェクトに変換してくれるJsonSlurperというクラスがあるのでそれを利用して実現できます。コードを見てみましょう。Document(slurper))JsonSlurperのインスタンスを生成して、parseTextメソッドにすでに存在しているテキスト形式のJSONを渡すだけです。Documentに渡してあげればちゃんとMongoDBに保存されます。おまけ1(特定ドキュメントのUPDATE)updateOneやupdateManyでは、MongoDB上で対象ドキュメントの検索と更新が行われます。該当ドキュメントの情報をGroovy上で加工して、さらにそのドキュメンをUPDATEするにはどうすればいいのでしょうか?実はまだよく理解できていません。一応、以下のコードでドキュメントを検索して、それぞれのtypeフィールドの内容を、それぞれの_idフィールドの値を付加してUPDATEすることが出来ます。別の良いアプローチがあるとは思いますが、とりあえずコレでも問題はないはずです。it.newType.toString()))}おまけ2(JsonBuilderのComposite)どういうことか?単純にJsonBuilderインスタンスの中で、別のJsonBuilderインスタンスを扱う、というだけです。クセがあって、JsonBuilderの中で利用される別のJsonBuilderは、.contentでその値を取得しなければならない、という点です。なんの事だかワケ分かんないですよね。builder2.toPrettyString()collection.insertOne(Document.parse(builder2.toPrettyString()))これで、1件新しいドキュメントがMongoDBに保存されます。builder2.toPrettyString()で表示されるJSONは以下のとおりです。}}特に難しいことはないですよね。あったJsonBuilderオブジェクトを、別のJsonBuilderで包んだ形です。builder.contentを見て分かるとおり、単純に別のJsonBuilderインスタンスから.contentでその中身を持ってくるだけでOKです。あるJSONを別のJSONで包む今回のような例だと、テキストベースでも当然実現できますがコードがゴチャゴチャしてしまいがちです。いった際に、JsonBuilderが力を発揮します。まとめいかがだったでしょうか。Groovyを使えば、MongoDB用の公式Java用ドライバを使って、さらに便利、シンプルにMongoDBを扱えることがわかったのではないでしょうか。最後に、今回のコードの全体を記述して終わりにさせていただきます。ありがとうございました。Groovy上で、複雑なJSONを生成する場合、JsonBuilderがとっても便利。VALUE"の形式だけど、間のコロンが必要なくなる。