展开MongoDB Scala驱动程序?

展开MongoDB Scala驱动程序?,mongodb,scala,casbah,Mongodb,Scala,Casbah,具有用于检索嵌套键的函数。 较新版本是否具有此功能?在Scala MongoDB驱动程序中,您可以使用宏从案例类生成编解码器。甚至你也可以为你的合作产品创建你的编解码器。根据文档:“支持简单案例类和嵌套案例类。”。因此,请看一看示例 ReactiveMongo也使用宏,但也有另一种使用无形状的方法,如:package org.mongodb.scala.bson 导入org.mongodb.scala.bson.DefaultHelper.DefaultsTo 导入scala.reflect.C

具有用于检索嵌套键的函数。
较新版本是否具有此功能?

在Scala MongoDB驱动程序中,您可以使用宏从案例类生成编解码器。甚至你也可以为你的合作产品创建你的编解码器。根据文档:“支持简单案例类和嵌套案例类。”。因此,请看一看示例

ReactiveMongo也使用宏,但也有另一种使用无形状的方法,如:

package org.mongodb.scala.bson
导入org.mongodb.scala.bson.DefaultHelper.DefaultsTo
导入scala.reflect.ClassTag
导入scala.util.Try
导入scala.collection.JavaConverters_
对象可扩展{
隐式类AddExpand(val底层:Document)扩展了AnyVal{
def expand[TResult parent.flatMap(p=>get[BsonDocument](p,pathEl))
}
.flatMap(p=>get[TResult](p,path.last))
}
}
def get[TResult
package org.mongodb.scala.bson

import org.mongodb.scala.bson.DefaultHelper.DefaultsTo

import scala.reflect.ClassTag
import scala.util.Try
import scala.collection.JavaConverters._

object Expandable {
  implicit class AddExpand(val underlying: Document) extends AnyVal {
    def expand[TResult <: BsonValue: ClassTag](key: String)(implicit e: TResult DefaultsTo BsonValue): Either[Throwable, TResult] = {
      val path = key.split('.')
      path.init.tail
        .foldLeft(Try(underlying.underlying.get(path.head).asDocument()).toEither){
          case (parent, pathEl) => parent.flatMap(p => get[BsonDocument](p, pathEl))
        }
        .flatMap(p => get[TResult](p, path.last))
    }
  }

  def get[TResult <: BsonValue](parent: BsonDocument, key: String)(implicit e: TResult DefaultsTo BsonValue, ct: ClassTag[TResult]): Either[Throwable, TResult] = {
    Try(parent.asScala.get(key).map(ct.runtimeClass.cast).map(_.asInstanceOf[TResult]).getOrElse(throw new NoSuchElementException(key))).toEither
  }
}