如何使用Casbah和Subset管理多个级别的对象?

时间:2012-02-01 09:34:25

标签: scala mongodb mongodb-scala

我有三个对象

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应用程序中,它们应该由它们的类型表示。

我正在使用Subset,并定义了以下性质

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和来自Mongo Now? 围绕这个的任何例子?

1 个答案:

答案 0 :(得分:1)

Integration test是如何使用嵌套对象,查询,更新等的一个很好的示例。此测试的部分内容也分散在documentation中。

如果您打算阅读Mongo,您需要阅读模型的所有部分。如果您打算查询或更新,您也需要编写者。如果Scala编译器找不到必要的隐式,则应该发出错误。

您如何查询Profile

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的读者/作家中解决这个问题。