2011年9月11日日曜日

gmongoで全collectionに対してvalidateコマンドを実行する

全collectionに対してvalidateコマンドを実行するには、以下のコードを実行します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
// 全DBの全collectionに対してvalidateコマンドを実行
mongo.getDatabaseNames().each { dbname ->
  db = mongo.getDB(dbname)
  db.getCollectionNames().each { colname ->
    println db.command(validate:colname, scandate:true, full:true)
  }
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月9日金曜日

gmongoで最大BSONオブジェクトサイズを取得する

gmongoで最大BSONオブジェクトサイズを取得するには、以下のコードのようにgetMaxBsonObjectSizeを使用します。
@Grab(group='com.gmongo', module='gmongo', version='0.9')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
// 現在のmaster serverの最大オブジェクトサイズを取得する
println "max BSON object size(MB):" + mongo.getMaxBsonObjectSize()/1024/1024

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月6日火曜日

gmongoとROMEでRSSフィードのエントリをmongodbに格納する

gmongoとROMEでRSSフィードのエントリをmongodbに格納するには、以下のコードを実行します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
@Grab(group='rome', module='rome', version='1.0')
import com.mongodb.*
import com.gmongo.*
import com.sun.syndication.feed.synd.*
import com.sun.syndication.io.*

uri = "http://feeds.dzone.com/dzone/frontpage?format=xml"
SyndFeed feed = new SyndFeedInput(false).build(
  new InputStreamReader(new URL(uri).openStream(), "UTF-8")
)

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
col = db["entries"]
// ユニークインデックスなければ作成する
col.ensureIndex(
  new BasicDBObject([feedTitle:true, link:true]),
  new BasicDBObject([unique:true])
)
col.setWriteConcern(WriteConcern.NORMAL);
// RSS/Atomのエントリーをコレクションに追加
for( entry in feed.entries ){
  wr = col.insert([feedTitle:feed.title, link:entry.link,
    publishedDate:entry.publishedDate, title:entry.title])
  println "error:" + wr.getError()
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月5日月曜日

gmongoでsnapshotを使用して全件検索する

gmongoでsnapshotを使用して全件検索するには、以下のコードのように実装します。snapshotにより同一オブジェクトの重複を排除して検索します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["office_location"].drop()
// コレクションにオブジェクトを挿入する
col = db["office_location"]
col.insert([office:"Tokyo", country:"Japan"])
col.insert([office:"Sanfrancisco", country:"United States"])
col.insert([office:"Chicago", country:"United States"])
// 重複を排除した形で全件検索
for(obj in col.find().snapshot()){
  println obj
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月4日日曜日

gmongoでコレクション毎のストレージサイズ・インデックスサイズを取得する

gmongoでコレクション毎のストレージサイズ・インデックスサイズを取得するには、以下のコードを実行します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
// 各コレクションのストレージサイズ・インデックスサイズを取得
for(col in db.getCollectionNames()){
  println "collection name:" + col +
   ", storage size:" + db[col].getStats().storageSize +
   ", total index size:" + db[col].getStats().totalIndexSize
}

動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月3日土曜日

gmongoでbulk insertを使用してオブジェクトを挿入する

gmongoでbulk insertを使用してオブジェクトを挿入するには、以下のコードの2番目コードのinsertのように配列でオブジェクトを渡します。bulk insertでは通常のinsertと比較して高速にオブジェクトを挿入できます。
通常のinsertのコード
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
// DBが既に存在する場合は削除
dbname = "perftest"
if( mongo.getDatabaseNames().contains(dbname) ){
  mongo.dropDatabase(dbname)
}
db = mongo.getDB("perftest")
st = System.currentTimeMillis()
// コレクションにオブジェクトを挿入する
col = db["stores"]
(1..10000).each{
  col.insert([country:"Japan", store:"store_${it}", sales:100])
}
println "processed ${col.count()} rows in ${System.currentTimeMillis()-st}ms."
bulk insertを使用したコード
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
// DBが既に存在する場合は削除
dbname = "perftest"
if( mongo.getDatabaseNames().contains(dbname) ){
  mongo.dropDatabase(dbname)
}
db = mongo.getDB("perftest")
st = System.currentTimeMillis()
// コレクションにオブジェクトを挿入する
col = db["stores"]
(1..10000).step(2){
  col.insert([
    [country:"Japan", store:"store_${it}", sales:100],
    [country:"Japan", store:"store_${it+1}", sales:100]
  ])
}
println "processed ${col.count()} rows in ${System.currentTimeMillis()-st}ms."
実行速度計測結果

通常insert(ms)bulk insert(x2)(ms)
1回目38552961
2回目40762980
3回目35763314
平均3835.673085


動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

2011年9月1日木曜日

gmongoでグループ毎の最小値・最大値を求める

gmongoでグループ毎の最小値・最大値を求めるには、以下のコードのようにgroupを使用します。
@Grab(group='com.gmongo', module='gmongo', version='0.8')
import com.mongodb.*
import com.gmongo.*

mongo = new GMongo("localhost", 27017)
db = mongo.getDB("local")
db["stores"].drop()
// コレクションにオブジェクトを挿入する
col = db["stores"]
col.insert([country:"Japan", store:"store_A", sales:100])
col.insert([country:"Japan", store:"store_B", sales:120])
col.insert([country:"Japan", store:"store_C", sales:170])
col.insert([country:"United States", store:"store_D", sales:80])
col.insert([country:"United States", store:"store_E", sales:200])
col.insert([country:"United States", store:"store_F", sales:190])
col.insert([country:"United States", store:"store_G", sales:100])
// 国ごとの最小値・最大値を取得
for(obj in col.group(/* key */new BasicDBObject([country:true]),
  /* condition */new BasicDBObject(),
  /* initial */new BasicDBObject([smin:0, smax:0, firstobj:true]),
  /* reduce */"""
    function(obj,prev){
      if( prev.firstobj == true ){
        prev.smin = obj.sales;
        prev.smax = obj.sales;
        prev.firstobj = false;
       }
      if( prev.smin > obj.sales ){prev.smin = obj.sales;}
      if( prev.smax < obj.sales ){prev.smax = obj.sales;}
    }
  """
)){
  println obj["country"] + " min:${obj.smin} max:${obj.smax}"
}
動作環境
Groovy 1.8.0, JDK6 Update22, gmongo 0.8, MongoDB 1.8.2

関連情報
gmongoのウェブサイト
https://github.com/poiati/gmongo

groovyとMongoDBのまとめ

グループ分けして集計する