0

私は3つのオブジェクトを持っています

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])

Mongo DB には Profile オブジェクトのみを格納する予定ですが、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 との間でクエリを実行するにはどうすればよいですか? このあたりの例はありますか?

4

1 に答える 1

1

統合テストは、ネストされたオブジェクト、クエリ、更新などを操作する方法の良い例です。このテストの一部は、ドキュメント全体にも散らばっています。

Mongo から読み取る場合は、モデルのすべての部分のリーダーが必要です。クエリまたは更新を計画している場合は、ライターも必要です。Scala コンパイラは、必要な Implicit が見つからない場合、エラーを発行する必要があります。

Profilesをどのように照会しますか。

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/ライター。

于 2012-02-01T11:30:53.263 に答える