如何在MongoDB中有效编码Scala元组

时间:2015-11-29 17:51:16

标签: mongodb scala casbah

给出以下类型

type GeoLocation = (Double, Double)

我想将其存储在我的数据库中

location: [-55.23, 123.7]

此外,位置数据是可选的,因此API公开Option[GeoLocation]。当它存储数据时,我将其转换。

val coordinates: Option[GeoLocation] = ...
val location = coordinates match {
  case Some((lng, lat)) => Some(lng :: lat :: Nil)
  case None => None
}

这样我就可以选择将其添加到包含文档中。

location.map(doc.put("location", _))

当我想将数据库对象转换回GeoLocation时,我会这样讨厌...

val coordinates = dbo.getAs[MongoDBList]("location").map(_.toList.map(_.asInstanceOf[Double])) match {
  case Some(List(lng, lat)) => Some(lng, lat)
  case None => None
}

在我看来,在MongoDB中存储元组作为一个数组有很多仪式。是否有更有效和直接的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

这是编写相同内容的更简单方法:

val coordinates = dbo.getAs[Seq[Double]]("location").map { case Seq(lng, lat) => (lng, lat) }

如果您想更具保护性(如果数组中有两个以上元素,则不会出现MatchError),您可以“捕获”其余的内容:

val coordinates = dbo.getAs[Seq[Double]]("location") match {
    case Some(Seq(lng, lat)) => Some(lng, lat)
    case _ => None
  }