给出以下类型
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中存储元组作为一个数组有很多仪式。是否有更有效和直接的方法来实现这一目标?
答案 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
}