如何在MongoDB中高效地编码Scala元组
给定以下类型如何在MongoDB中高效地编码Scala元组,mongodb,scala,casbah,Mongodb,Scala,Casbah,给定以下类型 type GeoLocation = (Double, Double) 我想将其存储在我的数据库中 location: [-55.23, 123.7] 此外,位置数据是可选的,因此API公开了选项[GeoLocation]。当需要存储数据时,我将其转换 val coordinates: Option[GeoLocation] = ... val location = coordinates match { case Some((lng, lat)) => Some(l
type GeoLocation = (Double, Double)
我想将其存储在我的数据库中
location: [-55.23, 123.7]
此外,位置数据是可选的,因此API公开了选项[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从数据库对象转换回地理位置时,我会做这个讨厌的事情
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
}
有没有更好的答案?