Как управлять несколькими уровнями объектов, используя Casbah и Subset? - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть три объекта

case class Metric(val name: String, val tags: Map[String, String]) 

case class Threshold(val metric: Metric, val critical: Long, val warning: Long)

class Profile(val name: String, val thresholds: List[Threshold])

Я планирую хранить только объект Profile в Mongo DB, но в приложении Scala они должны быть представлены их типами.

Я используюПодмножество для того же самого и определило следующую природу

implicit val reader = ValueReader[Threshold]({
case metric(metric) ~ critical(critical) ~ warning(warning) =>
  new Threshold(metric, critical, warning)
})
implicit val writer = {
def f(threshold: Threshold): DBObject =
  (metric -> threshold.metric) ~ (critical -> threshold.critical) ~ (warning -> threshold.warning)
ValueWriter(f _)
} 

Как я могу отправлять запросы в и из Mongo Now?Какие-нибудь примеры вокруг этого?

1 Ответ

1 голос
/ 01 февраля 2012

Интеграционный тест - хороший пример того, как работать с вложенным объектом, выполнять запросы, обновлять и т. Д. Части этого теста также разбросаны по документации .

Если вы планируете читать из Монго, вам нужны читатели для всех частей вашей модели.Если вы планируете запрашивать или обновлять, вам также нужны писатели.Компилятор Scala должен выдать ошибку, если он не может найти необходимое неявное.

Как бы вы запросили Profile s:

object Profile {
  val name = "name".fieldOf[String]
  val thresholds = "thresholds".subset(Threshold).of[List[Threshold]]

  // typical query:
  def alarmsFor(metric: String) =
    collection.find( thresholds elemMatch {t =>
      t.metric.where{_.name == metric} && t.critical > 10
    } ) map {
      case name(n) ~ thresholds(t) => new Profile(n, t)
    }
}

В этом фрагменте я сделал несколько предположений:

  • Threshold поля определены в object Threshold (t где вы его получите)
  • Threshold.metric поле является подмножеством сам, например, val metric = "metric".subset(Metric).of[Metric], так что вы можете запросить metric.where{_.name == metric}

Обратите внимание, что в версии 0.7.0 до сих пор нет устройства чтения / записи для Map[String,T] (хотя я планирую его иметьв конце концов) - вам нужно будет его разработать (если вам нужно это поле) или обойти эту проблему в Metric читателе / ​​писателе.

...