Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MongoDB中高效地编码Scala元组_Mongodb_Scala_Casbah - Fatal编程技术网

如何在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
  }

有没有更好的答案?