takayuki_tk's diary

本当はScalaとかHaskellを使いたい

MongoDBとScala

日本語でMongoもだいぶ終わりに近づいたのでScalaで復習してみます。
Mongoのオンライン講義はこちら

https://education.10gen.com/courses/10gen/M101P/2013_September/about

WEEK1はMongoの特徴とか

コンセプト
  • 限りなくRDB並みの機能を追求しつつkey valu store並みのスケーラビリティを目指す。
特徴
  • ドキュメント思考DB。JSON形式でデータを保存できる。
    (Mongo内部ではBSONと呼ばれるJSONを拡張した形式で保存されている。)

  • schema less コレクション内部のドキュメントが同じ形式である必要はない。

RDBとの違い
  • joinをサポートしない。

  • transactionをサポートしない。

JSONは構造を持つ事ができるのでjoinが必要なケースは少ないはず。
またドキュメント単位でアトミックに処理できるのでtransactionにつても問題になるケースはすくない。

インストール

 省略

触ってみる

Biuld.scala

import sbt._
import sbt.Keys._

object MongoScalaBuild extends Build {

  lazy val root = Project(
    id = "mongo-scsala",
    base = file("."),
    settings = Project.defaultSettings ++ Seq(
      name := "mongo-scala",
      organization := "com.github.taka-",
      version := "1.0.0-SNAPSHOT",
      scalaVersion := "2.10.2",
      scalacOptions ++= Seq("-deprecation", "-language:_"),
      libraryDependencies ++= Seq(
        "org.mongodb" %% "casbah" % "2.6.3"
      ),
      initialCommands += """
        import com.mongodb.casbah.Imports._
        import com.mongodb.casbah.query.Imports._
        import com.mongodb.casbah.gridfs.Imports._
"""
    )
  )
}

sbtを立ち上げてconsoleを起動。

  • ローカルで起動したmongoに接続する。

scala> val uri = MongoClientURI("mongodb://localhost:27017/")
uri: com.mongodb.casbah.MongoClientURI = mongodb://localhost:27017/

scala> val mongoClient = MongoClient(uri)
mongoClient: com.mongodb.casbah.MongoClient = com.mongodb.casbah.MongoClient@b1f3c4e

  • testという名前のDBに接続

    scala> val db = mongoClient("test")
    db: com.mongodb.casbah.MongoDB = test

  • collectionsという名前のcollectionを作成

    scala> val collection = db("collections")
    collection: com.mongodb.casbah.MongoCollection = collections

  • とりあえず1件保存

    scala> collection.save(Map("name" -> "takayuki", "work" -> "engineer"))
    res: com.mongodb.WriteResult = { "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 0 , "connectionId" : 1 , "err" : null , "ok" : 1.0}

  • 保存された事を確認

    scala> collection.findOne()
    res: Option[collection.T] = Some({ "_id" : { "$oid" : "52638419b67876df1eb5f9eb"} , "name" : "takayuki" , "work" : "engineer"})