给定以下类型
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", _))
当我想把if从一个数据库对象转换回
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中有很多仪式。有没有更有效、更直接的方法来实现这一点?
最佳答案
这是一个简单的方法来写同样的东西:
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
}