12. MongoDB в Scala
Основные драйвера для работы с MongoDB:
• Casbah – синхронный, поверх драйвера для Java.
.
13. MongoDB в Scala
Основные драйвера для работы с MongoDB:
• Casbah – синхронный, поверх драйвера для Java.
• ReactiveMongo – асинхронный, основан на акторах
Akka.
.
14. MongoDB в Scala
Основные драйвера для работы с MongoDB:
• Casbah – синхронный, поверх драйвера для Java.
• ReactiveMongo – асинхронный, основан на акторах
Akka.
• Tepkin – реактивный, на Akka IO и Akka Streams.
.
15. Пример использования Casbah
val name = ”John Doe”
people.insert(MongoDBObject(
”name” -> ”James Bond”,
”age” -> 80,
”phone” -> List(”007007”),
”address” -> MongoDBObject(”country” -> ”UK”)))
.
16. Пример использования Casbah
val name = ”John Doe”
people.insert(MongoDBObject(
”name” -> ”James Bond”,
”age” -> 80,
”phone” -> List(”007007”),
”address” -> MongoDBObject(”country” -> ”UK”)))
val a = people.findOne(MongoDBObject(”name” -> name))
val b = people.find(MongoDBObject(”age” ->
MongoDBObject(”$lt” -> 30)))
.
17. Пример использования Casbah
val name = ”John Doe”
people.insert(MongoDBObject(
”name” -> ”James Bond”,
”age” -> 80,
”phone” -> List(”007007”),
”address” -> MongoDBObject(”country” -> ”UK”)))
val a = people.findOne(MongoDBObject(”name” -> name))
val b = people.find(MongoDBObject(”age” ->
MongoDBObject(”$lt” -> 30)))
// Using Casbah DSL
val c = people.find(”age” $lt 30)
val d = people.find(”phone” -> $not(_ $size 0))
people.update(MongoDBObject(”age” -> 42),
$set(”name” -> ”Ford Prefect”))
.
18. Пример использования Casbah
val name = ”John Doe”
people.insert(MongoDBObject(
”name” -> ”James Bond”,
”age” -> 80,
”phone” -> List(”007007”),
”address” -> MongoDBObject(”country” -> ”UK”)))
val a = people.findOne(MongoDBObject(”name” -> name))
val b = people.find(MongoDBObject(”age” ->
MongoDBObject(”$lt” -> 30)))
// Using Casbah DSL
val c = people.find(”age” $lt 30)
val d = people.find(”phone” -> $not(_ $size 0))
people.update(MongoDBObject(”age” -> 42),
$set(”name” -> ”Ford Prefect”))
val e = people.aggregate(List(
MongoDBObject(”$group” ->
MongoDBObject(”_id” -> ”$age”, ”count” ->
MongoDBObject(”$sum” -> 1))),
MongoDBObject(”$sort” -> MongoDBObject(”count” -> -1)),
MongoDBObject(”$limit” -> 5)))
.
22. Meet MongoQuery
Пример использования MongoQuery с Casbah:
import com.github.limansky.mongoquery.casbah._
val name = ”John Doe”
val a = people.findOne(mq”{ name : $name }”)
.
23. Meet MongoQuery
Пример использования MongoQuery с Casbah:
import com.github.limansky.mongoquery.casbah._
val name = ”John Doe”
val a = people.findOne(mq”{ name : $name }”)
val b = people.find(mq”{age : { $$lt : 30 }}”)
.
24. Meet MongoQuery
Пример использования MongoQuery с Casbah:
import com.github.limansky.mongoquery.casbah._
val name = ”John Doe”
val a = people.findOne(mq”{ name : $name }”)
val b = people.find(mq”{age : { $$lt : 30 }}”)
val d = people.find(
mq”{ phone : { $$not : { $$size : 0 }}}”)
people.update(mq”{ age : 42 }”,
mq”{ $$set { name : ’Ford Prefect’ }}”)
val e = people.aggregate(List(
mq”””{ $$group :
{ _id : ”$$age”, count : { $$sum : 1 }}}”””,
mq”{ $$sort : { count : -1 }}”,
mq”{ $$limit : 5}”))
.
50. Тестируем интерполятор
it should ”support nested objects” in {
val q = mq”””{ user : ”Joe”, age : {$$gt : 25}}”””
q should equal(MongoDBObject(”user” -> ”Joe”,
”age” -> MongoDBObject(”$gt” -> 25)))
}
.
51. Тестируем ошибки
import scala.reflect.runtime.{ universe => ru }
class CompileTest extends FlatSpec {
val cl = getClass.getClassLoader.asInstanceOf[URLClassLoader]
val cp = cl.getURLs.map(_.getFile).mkString(File.pathSeparator)
val mirror = ru.runtimeMirror(cl)
val tb = mirror.mkToolBox(options = s”-cp $cp”)
.
52. Тестируем ошибки
import scala.reflect.runtime.{ universe => ru }
class CompileTest extends FlatSpec {
val cl = getClass.getClassLoader.asInstanceOf[URLClassLoader]
val cp = cl.getURLs.map(_.getFile).mkString(File.pathSeparator)
val mirror = ru.runtimeMirror(cl)
val tb = mirror.mkToolBox(options = s”-cp $cp”)
def getError(q: String): String = {
val e = intercept[ToolBoxError] {
tb.eval(tb.parse(q))
}
e.message
}
.
53. Тестируем ошибки
import scala.reflect.runtime.{ universe => ru }
class CompileTest extends FlatSpec {
val cl = getClass.getClassLoader.asInstanceOf[URLClassLoader]
val cp = cl.getURLs.map(_.getFile).mkString(File.pathSeparator)
val mirror = ru.runtimeMirror(cl)
val tb = mirror.mkToolBox(options = s”-cp $cp”)
def getError(q: String): String = {
val e = intercept[ToolBoxError] {
tb.eval(tb.parse(q))
}
e.message
}
it should ”fail on malformed BSON objects” in {
val e = getError(”””mq”{ test 5 }” ”””)
e should include(”‘:’ expected, but 5 found”)
}
}
.
59. Выводы
Минусы
• Достаточно сложная реализация
• Не подсвечивается в IDE
Плюсы
• Меньше ограничений на встраиваемый язык
• Можно сохранить имеющийся язык
.
60. Выводы
Минусы
• Достаточно сложная реализация
• Не подсвечивается в IDE
Плюсы
• Меньше ограничений на встраиваемый язык
• Можно сохранить имеющийся язык
• Мартин Одерски сказал, что интерполяторы это круто
.